uboot tag存儲主要部分代碼

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_serial_tag
                setup_revision_tag
               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_videolfb_tag
               setup_end_tag
                    params->hdr.tag = 0x00000000      //tag標記
                    params->hdr.size = 0    //tag參數個數
相關文章
相關標籤/搜索