Linux Command Line 解析.docx_第1页
Linux Command Line 解析.docx_第2页
Linux Command Line 解析.docx_第3页
Linux Command Line 解析.docx_第4页
Linux Command Line 解析.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

处理模型Linux kernel的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line进行配置的。在进行后续分析之前,先来理解一下command line的处理模型:要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw。那么kernel就需要提供对这些参数进行处理的处理函数列表。根据参数的作用以及执行期的先后不同,这些处理函数被定义到不同的段中。针对每一个参数,Kernel都会到相应的段中查找相应的处理函数,最终进行各个组件的配置。1配置格式常见的配置格式如:console=ttySAC0,115200 root=nfs nfsroot=:/source/rootfs initrd=0x10800000,0x14af472配置方式2.1 Bootloader动态配置由bootloader进行参数配置,command line将做为atag_list的一个节点传递到Kernel。2.2 Kernel静态配置通过make menuconfig进行配置:运行后配置boot options-Default kernel command string。该配置将被静态编译到Kernel中,通过变量default_command_line访问。3解析配置3.1相关定义根据执行的先后顺序,可以将处理函数分为三个大类,他们分别存在于下面三个段中(参考top/arch/arm/kernel/vmlinux.lds):_setup_start = .; *(.init.setup) _setup_end = .;_early_begin = .; *(.early_param.init) _early_end = .;_start_param = .; *(_param) _stop_param = .;这三个段内存储的不是参数,而是command line参数所需要的处理函数。3.1.1 .early_param.init段“.early_param.init” 所定义的处理相对靠前一些,它所处理的参数例如:initrd=,cachepolicy=,nocache,nowb,ecc=,vmalloc=,mem=,等等。这些处理函数是通过_early_param宏来定义的,例如:static void _init early_initrd(char *p) _early_param(initrd=, early_initrd);对于宏_early_param,可以在top/arch/arm/include/asm/Setup.h中找到如下定义:struct early_params const char *arg;void (*fn)(char *p);#define _early_param(name,fn) static struct early_params _early_#fn _used _attribute_(_section_(.early_param.init) = name, fn 3.1.2 .init.setup段“.init.setup”定义的处理则要靠后一些,它所处理的参数例如:nfsroot=,ip=,等等。这些处理函数是通过_setup宏来定义的,例如:static int _init nfs_root_setup(char *line) _setup(nfsroot=, nfs_root_setup);对于宏_setup,可以在top/include/linux/Init.h中看到:#define _setup_param(str, unique_id, fn, early) static char _setup_str_#unique_id _initdata _aligned(1) = str; static struct obs_kernel_param _setup_#unique_id _used _section(.init.setup) _attribute_(aligned(sizeof(long) = _setup_str_#unique_id, fn, early #define _setup(str, fn) _setup_param(str, fn, fn, 0)/* NOTE: fn is as per module_param, not _setup! Emits warning if fn* returns non-zero. */#define early_param(str, fn) _setup_param(str, fn, fn, 1)注意看的话,可以看到还有一个宏early_param,它与宏_setup的定义相似,只不过最后一个宏参数是1而不是0。1表示需要提前处理的参数。3.1.3_param段这个段中保存的是build-in类型module的配置参数。该宏直接用来修饰需要的变量。3.2解析3.2.1相关变量相关的变量包括:default_command_line:保存memuconfig配置的参数,如果bootloader传入了命令行参数,那么这个新的配置将被更新到该变量中。boot_command_line:存在于.init.data段。最初是default_command_line的拷贝。command_line:存在于.init.data段。在parse_cmdline()中被赋值,数据来源是default_command_line。saved_command_line:用于保存没有处理过的命令行参数,是boot_caommand_line的拷贝。static_command_line:是command_line的拷贝。3.2.2主要函数函数名称:parse_cmdline()操作数据:default_command_line。函数列表:.early_param.init段(在_early_begin和_early_end之间)。函数功能:依据函数列表对default_command_line中的参数进行处理。函数名称:parse_early_param()操作数据:boot_command_line。函数列表:.init.setup段中(_setup_start和_setup_end之间),主要是通过宏early_param定义的部分。函数功能:依据函数列表对boot_command_line中的参数进行处理。注意parse_one()的第四个入参是0,而且第五个参数是NULL。这里没有给出参数队列,不会对boot_command_line的每个参数在参数队列中进行对比查找,而是直接在do_early_param()中进行条件判断,如果满足下面的条件,那么对该参数进行对应的操作:if (p-early & strcmp(param, p-str) = 0) |(strcmp(param, console) = 0 &strcmp(p-str, earlycon) = 0)函数名称:parse_args()操作数据:static_command_line。函数列表:_param段(_start_param和_stop_param之间)。函数功能:该操作将依据函数列表,对static_command_line中的参数进行相应的操作。这个操作在parse_one()的第一部分代码完成:for (i = 0; i num_params; i+) if (parameq(param, ) DEBUGP(They are equal! Calling %pn,paramsi.set);return paramsi.set(val, ¶msi);接下来对于不被这个列表所支持的参数,将在unknown_bootoption()中进行处理。在unknown_bootoption()中主要是obsolete_checksetup()的操作。函数名称:obsolete_checksetup()操作数据:static_command_line。函数列表:.init.setup段中(_setup_start和_setup_end之间),

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论