,来控制内核启动的过程,例如:"console=ttyS2,115200mem=******@0xA0000000"这里指定了控制台是串口2,波特率是115200,内存大小是64M,物理基地址是0xA0000000。另外我们可以在内核中定义一些全局变量,使用这些全局变量控制内核的配置,例如usb驱动中定义了staticintnousb;/*DisableUSBwhenbuiltintokernelimage*/这个变量为1,则整个usb驱动不初始化,如果想将其置1,可在字符串命令行中添加nousb=1。在操作该变量之前,还要让系统知道该变量,方法是:__module_param_call("",nousb,param_set_bool,param_get_bool,&nousb,0444);__module_param_call这个宏定义在kernel\include\linux\:#define__module_param_call(prefix,name,set,get,arg,perm)\har__param_str_##name[]=prefix#name;\staticstructkernel_paramconst__param_##name\__attribute_used__\__attribute__((unused,__section__("__param"),aligned(sizeof(void*))))\={__param_str_##name,perm,set,get,arg}它定义了一个kernel_param类型的变量,这个变量被放到了段__param,kernel_param结构体的定义是:structkernel_param{constchar*name;unsignedintperm;param_set_fnset;param_get_fnget;void*arg;};__param这个段的声明有些平台是在arch/../../,而大多数平台是放到kernel\include\asm-generic\,定义如下:__param:AT(ADDR(__param)-LOAD_OFFSET){\VMLINUX_SYMBOL(__start___param)=.;\*(__param)\VMLINUX_SYMBOL(__stop___param)=.;\}内核启动时就会对字符串命令进行解析,在kernel\init\,内核启动函数start_kernel中对外部数组进行了声明:externstructkernel_param__start___param[],__stop___param[];然后调用函数parse_args对数组进行解析:parse_args("Bootingkernel",command_line,__start___param,__stop___param-__start___param,&unknown_bootoption);mand_line就是要解析的字符串命令行,unknown_bootoption是函数指针,它用来获取指定参数的=右边的值。parse_args就会在数组中找到和nousb名称一样的kernel_param变量,并调用它的set函数对其进行付值。,,但是该文件是由vmlinux-,根据编译选项的不同源文件还可以是vmlinux-,vmlinux-armv-。vmlinux-=arch/arm/vmlinux-:arch/arm/Makefile$(LD)\$(wildcardinclude/config/cpu/)\$(wildcardinclude/config/cpu/)\$(wildcardinclude/config/arch/*.h)***@echo'Generating$@'***@sed's/TEXTADDR/$(TEXTADDR)/;s/DATAADDR/$(DATAADDR)/'$(LD)>$***@vmlinux-:OUTPUT_ARCH(ar
linux 2[1].6 启动流程分析 来自淘豆网m.daumloan.com转载请标明出处.