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->hdr.tag == ATAG_CORE) {
//已经被 fixup 函数修改,则将 atag 中的 mem 段置为 none
if (meminfo.nr_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++)
if (tag->hdr.tag == t->tag) {
t->parse(tag);
break;
}
return t < &__tagtable_end;
}
}
C. 将 cmdline 存放至 saved_command_line 中