uboot分析

uboot

uboot的目的是啓動內核

其中需要做2個動作

1 將內核從flash讀出到內存

   uboot啓動時候依賴於兩條條啓動命令 boot CMD,  這兩條boot命令可以在串口通過命令查看 nand read.jffs2    bootm

   讀內核時用 do_nand 函數來實現 

  嵌入式中使用如下定義了flash的分區,例如:

  #define MTDPARTS_DEFAULT  "mtdparts=nandflash0:256k@0(bios)," \
                              "128k(params)," \
                              "128k(toc)," \
                              "256k(eboot)," \
                              "1792k(logo)," \
                              "3m(kernel)," \
                              "-(root)"

 有分區即可知道哪裏存放內核,即可讀相應位置

 

2 bootm

 

uboot啓動的內核是uimage

uimage是一個頭部+真正的內核,頭部裏面放置了內核的加載地址和入口偏移地址,通過分析頭部信息即可進入執行內核

bootm在處理uimage時候會先去解析頭部從而做成相應動作

 

2.1 傳遞啓動參數

   在某個地址按某種格式存放數據這種數據格式叫 struct tag

   例如代碼:

static struct tag *params;

static void setup_start_tag (bd_t *bd)
{
 params = (struct tag *) bd->bi_boot_params;

 params->hdr.tag = ATAG_CORE;
 params->hdr.size = tag_size (tag_core);

 params->u.core.flags = 0;
 params->u.core.pagesize = 0;
 params->u.core.rootdev = 0;

 params = tag_next (params);
}

當這個函數執行完成之後,uboot放參數的位置就放置好了函數裏面列出的各種參數,接下來還會進行一系列的參數放置

setup_memory_tags

setup_commandline_tag

setup_end_tag

2.2  跳到入口地址去執行

theKernel (0, bd->bi_arch_number, bd->bi_boot_params);

第二個參數是開發板子的型號,第三個參數是參數地址

-------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章