深入理解 bootloader 启动linux atags/boot param 传递

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 的格式),完成各种初始化 !

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值