Bootloader 的作用是加载linux kernel 镜像(包括linux kernel source code 的镜像+ Ramdisk 镜像),
一般在u-boot 的bootloader 的commandlist 中使用loadkernel 命令。
之后就是boot 命令启动linux kernel, 这时候将完成bootloader 到linux kernel 的转移,bootloader 会将一些启动参数,比如boot param 等传递给linux kernel。
究竟是如何完成boot param 的传递呢:
都知道linux kernel C语言的入口函数是start_kernel()
在start_kernel()函数里面会有setup_arch(&command_line) ,
之后调用setup_processor(), setup_machine_fdt(__atags_pointer), setup_machine_tags(machine_arch_type).
这些调用流程如果有Jtag 的话,可以清晰的看到调用流程,同时需要注意的是linux kernel 编译的时候会进行GNU 编译优化, 如果一个函数是static 类型,而且只被调用过一次,那么这个函数就会被优化掉,不会产生栈帧,类似有内联函数的处理。
接着说setup_machine_tags()
这个函数中会有如下代码:
if(__atags_pointer)
tags = phys_to_virt(__atags_poniter);
这里解释一下,__atags_pointer 是在head-common.S 中进行的赋值操作。
也就是说在start_kernel 打上断点的话就能看到__atags_pointer 的值,在OMAP4430开发板上就是0x80000100,这是物理地址。
因此,需要使用phy_to_virt() 函数把物理地址转换成虚拟地址。转换后一般就是0xc0000100,这样在这个地址上就能看到boot param 了!
接下来, linux kernel 就会根据boot param (XXX=XXX 的格式),完成各种初始化 !