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函数启动)。
原文:https://www.cnblogs.com/zhuangquan/p/11435345.html