首页 > 其他 > 详细

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

时间:2019-08-30 16:57:55      阅读:108      评论:0      收藏:0      [点我收藏+]

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函数启动)。

 

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

原文:https://www.cnblogs.com/zhuangquan/p/11435345.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!