theKernel参数解析

来源:互联网 发布:网页的优化方案 编辑:程序博客网 时间:2024/06/15 05:10
void (*theKernel)(int zero, int arch, uint params);

theKernel是一函数指针,它指向kernel的启动地址,对于uImage格式的内核,kernel=image_header_t结构体的ih_ep值

theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);

这里存在一个转换:ntohl(hdr->ih_ep),原因在于下面两行代码:
mkimage.cep = addr;// 通过mkimage工具传入的内核实际地址(不是uImage的首地址)hdr->ih_ep = htonl(ep);

启动内核的代码为:
theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
这里涉及三个参数,第二、第三个参数bd->bi_arch_number、bd->bi_boot_params含义由名字就可以清楚的知道,至于第一个参数,为什是0?有什么内涵?
这是规定。
或者这么说,你要启动内核,必须这么做,它来自于linux-2.6.30.4\Documentation\arm\Booting:

下面一段话说的很透彻,摘自《bootloader与linux中位置无关代码的分析》:
“为什么要这样做呢?因为在跳转到内核前需要设置好r0、r1、r2这3个寄存器的值,而在一般的C函数调用过程中,入口参数就是使用r0、r1、r2...等来传递的,换言之,在3语句中调用theKernel函数时提供的3个入口参数最后将分别传给r0、r1、r2,这样就非常巧妙地通过C语言的特性来实现了r0、r1、r2的设置。”
0 0
原创粉丝点击