全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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段置为noneif (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 hdr.tag = t-tag) t-parse(tag);break;return t &_tagtable_end;C 将cmdline存放至saved_command_line中/在setup_arch函数刚开始就定义了char *from= default_command_line,因此通过下面这个函数实现把cmdline存放至saved_command_line中。memcpy(saved_command_line, from, COMMAND_LINE_SIZE);D 对cmdline做简单的 分析,主要是mem和initrd的这里的处理和B步比较类似,通过对cmdline中的一个个参数和_early_begin到_early_end间的参数进行比较。从而得到匹配的参数,然后调用其相应的parse函数进行处理,同时将剩余部分存放到setup_arch(&command_line)传进来的字符串指针command_line中。这部分先对cmdline进行分析是因为接下来就需要对页表进行建立,所以必须知道内存mem和initrd文件系统的信息,所以这部分属于early,parse的参数很少。其余的参数解析都留至后面的参数分析中。2. parse_early_param();综述:第二次分析cmdline,不过在这里分析的是系统能够辨别的一些早期参数(这个函数甚至可以去掉),而且在分析的时候并不是以setup_arch(&command_line)传出来的command_line为基础,而是以最原生态的saved_command_line为基础的。详解:parse_args(early options, tmp_cmdline, NULL, 0, do_early_param);args = next_arg(args, ¶m, &val);/一个个参数分离ret = parse_one(param, val, params, num, unknown(就是do_early_param));/解析参数由于传进去的num为0,因此对于每一个参数param和值value,直接调用do_early_param解析。/ do_early_param这部分的实现就和1中的B/D的处理类似,通过对_setup_start和_setup_end区间的参数进行比较,找到对应的参数,调用该参数的解析函数。这部分的定义是以_setup(str, fn)的类型出现的,在linux中这类型的启动参数有非常多(比如root,console,ro,rw,rootfstype,md,resume),几乎这步可以涵盖所有有用的,而且我们自己也可以增加这种操作来支持新的启动参数。static int _init do_early_param(char *param, char *val)struct obs_kernel_param *p;for (p = _setup_start; p early & strcmp(param, p-str) = 0) if (p-setup_func(val) != 0)printk(KERN_WARNING Malformed early option %sn, param);3. parse_args(Booting kernel, command_line, _start_param, _stop_param - _start_param, &unknown_bootoption);综述:对于比较新的版本真正起作用的函数,与2的parse_early_param();相比,此处对解析列表的处理范围加大了,解析列表中除了包括系统以setup定义的启动参数,还包括模块中定义的param参数以及系统不能辨别的参数。详解:command_line是setup_arch函数传递出来的值;_start_param是param参数的起始地址,在System.map文件中能看到_stop_param - _start_param是参数个数unknown_bootoption是对应与启动参数不是param的相应处理函数同样跟进去最核心的函数也是parse_args(同2中分析):parse_args(early options, tmp_cmdline, NULL, 0, do_early_param);args = next_arg(args, ¶m, &val);/一个个参数分离ret = parse_one(param, val, params, num, unknown(就是do_early_param));/解析参数由于传进去的num为就是parm的个数,所以先要将启动参数和param一个个比较。static int parse_one(char *param,char *val,struct kernel_param *params, unsigned num_params,int (*handle_unknown)(char *param, char *val)unsigned int i;/先寻找启动参数是否和param匹配, param变量一般是在驱动模块中module_param定义的,存放在*(param)空间。如果匹配则将param参数的值用相应的value代替。/也就是说通过这种方式可以在启动参数中为驱动的参数赋值,而且可以看出linux中认为param参数是以后主要使用的启动参数传递方式,将慢慢摒弃_setup的形式。for (i = 0; i num_params; i+) if (parameq(param, ) DEBUGP(They are equal! Calling %pn, paramsi.set);return paramsi.set(val, ¶msi);/当然对于嵌入式的cmdline,一般而言都没有param参数的值,所以都是调用此处的handle_unknown如一个很简单的例子:Kernel command line: root=/dev/mtdblock3 console=ttyS0,115200 rootfstype=yaffs mem=32mUnknown argument: calling c00082e4parram is root, val is /dev/mtdblock3parram is console, val is ttyS0,115200parram is rootfstype, val is yaffsif (handle_unknown) DEBUGP(Unknown argument: calling %pn, handle_unknown);return handle_unknown(param, val);/* Handle obsolete-style parameters */其实我们的参数在handle_unknown中还是过时的参数解析方式的,就是obsolette_checksetup函数,这个函数内部的处理和parse_early_param()类似,所以这里就不详细解释了。if (obsolete_chec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年上海电力大学单招职业适应性测试必刷测试卷附答案
- 2026年四川机电职业技术学院单招职业适应性考试必刷测试卷必考题
- 2026年周口理工职业学院单招职业技能考试必刷测试卷及答案1套
- 淮安市人民医院口腔病理诊断考核
- 新余市中医院日常生活活动能力评定考核
- 金华市人民医院检验质量控制考核
- 泰州市人民医院重症科际会诊考核
- 宣城市中医院咬合重建技术专项考核
- 南平市中医院皮秒激光技术专项考核
- 鹰潭市人民医院脑血管病急诊手术能力考核
- DGTJ08-85-2020 地下管线测绘标准
- 2025至2030中国文物保护行业市场发展现状分析及发展前景与投资机会报告
- 柔道知识课件
- 汽车改装技术课件
- 配网抢修指挥业务培训
- 中国创伤救治培训CTCT课件
- 行政执法三项制度培训会
- 2025至2030中国己二腈行业发展趋势分析与未来投资战略咨询研究报告
- 男生主题班会课件
- 初中美术课堂中绘画艺术与情感教育的结合实践论文
- 中医专科护理技术中医辨证施护制度
评论
0/150
提交评论