2024年5月11日发(作者:)

Linux启动bootargs参数分析

这几天刚好在看linux c语言启动,现在就顺便把内核在启动时解析bootargs这一块

单独拎出来讲解下,内核对于bootargs的解析分为几块:

1. setup_arch(&command_line);

综述:在这个函数中,系统会获得bootargs参数,并对其做简单的初步分析。并将

bootargs的参数保存在command_line这个地址中。

详解:

A. 先获得bootargs的地址,uboot传进来的参数是放在30000100的地方的

//一般默认为0x30000100位置//boot_params 如果为0则表示bootloader没有传

参数

if (mdesc->boot_params)

tags = phys_to_virt(mdesc->boot_params);

B. 是通过标签ATAG来辨别的, uboot中有相应的标签字,将相应的uboot参

数放置到相应的全局变量中。

if (tags-> == ATAG_CORE) {

//已经被fixup函数修改,则将atag中的mem段置为none

if (_banks != 0)

squash_mem_tags(tags);

//继续把atag的参数传递结束, 通过参数的类型(比如ATAG_CMDLINE,

ATAG_MEM诸如此类的参数)将bootargs参数全部分析完毕。

parse_tags(tags);

{

extern struct tagtable __tagtable_begin, __tagtable_end;

struct tagtable *t;

//我们的参数是放在__tagtable_begin到__tagtable_end区间内,各个类型的通过

__tagtable的宏定义在编译的时候就将其定位在这个区间,我们的每一个参数只需要和每

个宏比较,并调用其对用的parse函数。

//对于我们一般的bootargs,只传递了ATAG_CMDLINE,而在其对应的parse函

数就是把传递进来的cmdline存放到default_command_line中。

for (t = &__tagtable_begin; t < &__tagtable_end; t++)