https://www.cnblogs.com/pokerface/p/5217106.html

cmd_bootm.c //傳遞給內核的參數
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
do_bootm_linux (cmdtp, flag, argc, argv, addr, len_ptr, verify);
原型:void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], ulong addr, ulong *len_ptr, int verify)
char *commandline = getenv ("bootargs");
void (*theKernel)(int zero, int arch, uint params); //函數指針
theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep); //跳轉到內核的位置ntohl(hdr->ih_ep)
setup_start_tag //tag分爲tag_header、union.u兩部分組成
params->hdr.tag = 0x54410001 //tag_header爲先size後tag組成
params->hdr.size = tag_size(tag_core) = 5 //union.u由不少部分組成,詳見源文件asm-arm/setup.h
#define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
struct tag_header { u32 size;u32 tag;}; //8字節
struct tag_core { u32 flags;u32 pagesize;u32 rootdev;}; //12字節
>> 2 //除以4等於5
params->u.core.flags = 0; //struct tag->union.u.tag_core.flags
params->u.core.pagesize = 0; //struct tag->union.u.tag_core.pagesize
params->u.core.rootdev = 0; //struct tag->union.u.tag_core.rootdev
params = tag_next(params); //當前地址修改成下一個tag始地址
#define tag_next(t) ((struct tag *)((u32 *)(t) + (t)->hdr.size))params地址+tag大小(此處大小爲unsigned int 因此一個大小爲4字節)=20字節
setup_memory_tags
params->hdr.tag = 0x54410002 //tag標記
params->hdr.size = tag_size(tag_mem32) = 4 //tag參數個數
#define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
struct tag_header { u32 size;u32 tag;}; //8字節
struct tag_mem32 { u32 size; u32 start; }; //8字節
>> 2 //除以4等於4
params->u.mem.start = 0x30000000;
params->u.mem.size = 64*1024*1024;
params = tag_next(params); //當前地址修改成下一個tag始地址
setup_commandline_tag(char *cmdline)
params->hdr.tag = 0x54410009 //tag標記
params->hdr.size = (sizeof (struct tag_header) + strlen(cmdline) + 1 + 4) >> 2 = 未知 //tag參數個數
struct tag_header { u32 size;u32 tag;}; //8字節
int strlen(char *str){int i = 0; while(str[i]) { i++;} return i;} //字符串的大小 未知
>> 2 //除以4等於未知
strcpy(params->u.cmdline.cmdline, cmdline); //將命令拷貝進結構體存儲
params = tag_next(params); //當前地址修改成下一個tag始地址
params->hdr.size = (sizeof(struct tag_header)+strlen(cmdline)+1+4)>>2; //’+1’表示字符結束標誌’\0’, ‘+4’表示除以4轉換成整型時向上取整
setup_end_tag
params->hdr.tag = 0x00000000 //tag標記
params->hdr.size = 0 //tag參數個數