资源描述:
《Linux Command Line 解析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、处理模型Linuxkernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过commandline 进行配置的。在进行后续分析之前,先来理解一下commandline 的处理模型:要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw 。那么kernel 就需要提供对这些参数进行处理的处理函数列表。根据参数的作用以及执行期的先后不同,这些处理函数被定义到不同的段中。针对每一个参数,Ker
2、nel 都会到相应的段中查找相应的处理函数,最终进行各个组件的配置。1 配置格式常见的配置格式如: console=ttySAC0,115200root=nfsnfsroot=192.168.1.9:/source/rootfsinitrd=0x10800000,0x14af47 2 配置方式2.1Bootloader动态配置由bootloader 进行参数配置,commandline 将做为atag_list 的一个节点传递到Kernel 。2.2Kernel 静态配置通过makemenuconfig 进行配置:
3、运行后配置bootoptions->Defaultkernelcommandstring 。该配置将被静态编译到Kernel 中,通过变量default_command_line 访问。3 解析配置3.1 相关定义根据执行的先后顺序,可以将处理函数分为三个大类,他们分别存在于下面三个段中(参考top/arch/arm/kernel/vmlinux.lds ): __setup_start=.;*(.init.setup)__setup_end=.; __early_begin=.;*(.early_param.i
4、nit)__early_end=.; __start___param=.;*(__param)__stop___param=.; 这三个段内存储的不是参数,而是commandline 参数所需要的处理函数。3.1.1.early_param.init段“.early_param.init ”所定义的处理相对靠前一些,它所处理的参数例如:initrd= ,cachepolicy=,nocache , nowb , ecc= , vmalloc= , mem= ,等等。这些处理函数是通过__early_param宏来定
5、义的,例如:staticvoid__initearly_initrd(char**p){……}__early_param("initrd=",early_initrd);对于宏__early_param,可以在top/arch/arm/include/asm/Setup.h 中找到如下定义: structearly_params{ constchar*arg; void(*fn)(char**p);};#define__early_param(name,fn)staticstructearly_par
6、ams__early_##fn__used__attribute__((__section__(".early_param.init")))={name,fn} 3.1.2.init.setup段 “.init.setup ”定义的处理则要靠后一些,它所处理的参数例如:nfsroot= , ip= ,等等。这些处理函数是通过__setup宏来定义的,例如: staticint__initnfs_root_setup(char*line){……}__setup("nfsroot=",nfs_root_setup)
7、; 对于宏__setup,可以在top/include/linux/Init.h 中看到: #define__setup_param(str,unique_id,fn,early) staticchar__setup_str_##unique_id[]__initdata__aligned(1)=str; staticstructobs_kernel_param__setup_##unique_id __used__section(.init.setup)
8、 __attribute__((aligned((sizeof(long))))) ={__setup_str_##unique_id,fn,early}#define__setup(str,fn) __setup_param(str,fn,fn,0)/*NOTE:fnisaspermodule_param,not__setup