资源描述:
《linux2.6启动流程分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、linux2.6启动流程分析linux2.6启动传递命令行分析内核在启动时可以传递一个字符串命令行,来控制内核启动的过程,例如:"console=ttyS2,115200mem=64M@0xA0000000"这里指定了控制台是串口2,波特率是115200,内存大小是64M,物理基地址是0xA0000000。另外我们可以在内核中定义一些全局变量,使用这些全局变量控制内核的配置,例如usb驱动中定义了staticintnousb;/*DisableUSBwhenbuiltintokernelimage*/这个变量为1,则整个usb驱动不初始化,如果想将其
2、置1,可在字符串命令行中添加nousb=1。在操作该变量之前,还要让系统知道该变量,方法是:__module_param_call("",nousb,param_set_bool,param_get_bool,&nousb,0444);__module_param_call这个宏定义在kernelincludelinuxmoduleparam.h原型如下:#define__module_param_call(prefix,name,set,get,arg,perm) staticchar__param_str_##name[]=prefix
3、#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{const
4、char*name;unsignedintperm;param_set_fnset;param_get_fnget;void*arg;};__param这个段的声明有些平台是在arch/../../vmlinux.lds.S,而大多数平台是放到kernelincludeasm-genericvmlinux.lds.h中,定义如下:__param:AT(ADDR(__param)-LOAD_OFFSET){ VMLINUX_SYMBOL(__start___param)=.; *(__param) VMLINU
5、X_SYMBOL(__stop___param)=.; }内核启动时就会对字符串命令进行解析,在kernelinitmain.c中,内核启动函数start_kernel中对外部数组进行了声明:externstructkernel_param__start___param[],__stop___param[];然后调用函数parse_args对数组进行解析:parse_args("Bootingkernel",command_line,__start___param, __stop___param-__start___param,
6、 &unknown_bootoption);其中command_line就是要解析的字符串命令行,unknown_bootoption是函数指针,它用来获取指定参数的=右边的值。parse_args就会在数组中找到和nousb名称一样的kernel_param变量,并调用它的set函数对其进行付值。内核启动地址的确定内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,但是该文件是由vmlinux-armv.lds.in生成的,根据编译选项的不同源文件还
7、可以是vmlinux-armo.lds.in,vmlinux-armv-xip.lds.in。vmlinux-armv.lds的生成过程在kernel/arch/arm/Makefile中LD =arch/arm/vmlinux-armv.lds.inarch/arm/vmlinux.lds:arch/arm/Makefile$(LD)$(wildcardinclude/config/cpu/32.h)$(wildcardinclude/config/cpu/26.h)$(wildcardinclude/config/arch/*.h)
8、@echo' Generating$@'@sed's/TEXTADDR/$(TEXTADDR)/;s/DA