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++)


发布评论