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);
第二個參數是開發板子的型號,第三個參數是參數地址
-------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------