uboot源码解析之引导内核启动(四)

1.内核启动命令bootm

  内核启动的两个条件: 1.从Flash中读出内核 2.bootm命令

  在uboot界面,通过prinenv可以看到类似bootm 0x30008000环境变量。bootm的作用就是引导启动内核。

  根据上一章的内容可知,有一个U_BOOT_CMD的宏来定义bootm。里面主要有两个主要的结构体成员,一个就是指针name,指向字符串“bootm”。另一个是函数指针,指向do_bootm函数。一旦我们使用了bootm命令,就会调用do_bootm函数。

  由于do_bootm函数内容过长,主要挑几个比较重要的讲解:

  

~/include/image.h
typedef struct image_header {
    uint32_t    ih_magic;    /* Image Header Magic Number    */
    uint32_t    ih_hcrc;    /* Image Header CRC Checksum    */
    uint32_t    ih_time;    /* Image Creation Timestamp    */
    uint32_t    ih_size;    /* Image Data Size        */
    uint32_t    ih_load;    /* Data     Load  Address        */
    uint32_t    ih_ep;        /* Entry Point Address        */
    uint32_t    ih_dcrc;    /* Image Data CRC Checksum    */
    uint8_t        ih_os;        /* Operating System        */
    uint8_t        ih_arch;    /* CPU architecture        */
    uint8_t        ih_type;    /* Image Type            */
    uint8_t        ih_comp;    /* Compression Type        */
    uint8_t        ih_name[IH_NMLEN];    /* Image Name        */
} image_header_t;

~/common/cmd_bootm.c
image_header_t header;
image_header_t
*hdr = &header;

  header是一个image_header_t结构体类型的变量。其中image_header_t主要是对内核进行描述。主要关心两个结构体成员:ih_load和ih_ep。前者是加载地址,后者是入口地址。(假如ih_load的值是0x30008000,那么使用bootm时候的地址应该是0x30007FC0,因为两个相减等于64,这64k就是这个头的大小,后面就是我们正常使用的内核)。

  那么bootm都做了什么事情呢? 

  1.      根据header将内核移动到合适的地方。

  2.      启动内核(通过do_bootm_linux函数启动)。

扫描二维码关注公众号,回复: 7137283 查看本文章

猜你喜欢

转载自www.cnblogs.com/zhuangquan/p/11435345.html