内核启动参数解析
原创声明:作者保留一切权力,转载请注明出处。
所有资料均来源于互联网,若侵犯了您的权利,请告知,作者一定修正之。
一、内核获得启动参数的四种形式
>>>>>>>>> 引用
[1]Linux系统 kernel参数传递方式详细解析
1、最常用的方式,就是在 make config里修改“ General Setup”子菜单中的“ Defaultkernel command string”选项,通过修改这个选项来修改 include/linux/autoconf.h文件中的 CONFIG_CMDLINE宏。
2、有的时候为了省去 make menuconfig的时间,并且内核命令也是固定的,就可以写死内核 arch/arm/setup.c文件 default_command_line,这个变量本来是初始化为 CONFIG_CMDLINE的。
3、除了方法 1之外,另外一种正规的方法就是将内核命令写入内核参数表中,然后通过 start_kernel()->setup_arch()->parse_tags()->parse_tag()->parse_tag_cmdline()函数来将内核参数表中的内核命令覆盖 default_command_line变量(当然你首先得有内核参数表)。
4、最后,有的板子会采取直接将内核命令通过 bootloader传递给内核
<Q001>怎样传递呢?
<A001>[2]内核参数问题
在 UBOOT中使用 bootm命令可以将参数传递给内核(其实就是将参数放到 DRAM_BASE+0x00000100处,然后内核从此处读取)。
DRAM_BASE+0x00000100处是否有 TAG LIST,有的话从此处读取;
若没有,则使用 default_command_line,这个就是在配置内核 make menuconfig的时候设置的,即 CONFIG_CMDLINE。
>>>>>>>>> 引用
二、内核启动参数的格式与含义
命令行的格式类似于下面的样子
CONFIG_CMDLINE="mem=64M console=ttySAC0 root=/dev/ram initrd=0xc0800000,0x00800000 ramdisk_size=2048 rw"
<Q002>每个关键字分别代表什么含义,系统怎样解析呢?
<A002>从原理上,简单地讲,内核是做字符串解析。首先对整个字符串按空格分隔开,每个子串又由等号分隔。等号左边是系统预定义的关键字,等号右边是对应关键字解析函数的参数。
>>>>>>>>> 引用
[3]Linux内核启动参数详解
所有型如“ name= value”参数,如果没有被上面所述的设置函数 [指系统预定义关键字的解析函数 ]接收,将被解释为系统启动后的环境变量,
比如“ TERM=vt100”就会被作为一个启动时参数。
所有没有被内核设置函数接收也没又被设置成环境变量的参数都将留给 init进程处理,比如“ single”。
>>>>>>>>> 引用
<Q003> 系统已经支持哪些关键字,即其含义是什么?
<A003>
最详尽的解释无疑来自《 Linux Kernel in a Nutshell》 一书,第九章。
下面是国内博客转载的一个连接地址。
[4]Linux Kernel in a Nutshell
你还可以添加自定义的启动参数和对应的解析函数。
[5]增加自定义的内核启动参数
三、参考资料
[1]Linux系统 kernel参数传递方式详细解析
http://www.bitscn.com/os/linux/200710/116553.html
[2]内核参数问题 http://linux.chinaunix.net/techdoc/system/2007/08/25/966304.shtml
[3]Linux内核启动参数详解 http://edu.codepub.com/2009/1213/18715.php
[4]Linux Kernel in a Nutshell http://blog.chinaunix.net/u2/76263/showart_1212604.html
[5]增加自定义的内核启动参数 http://linux.chinaunix.net/techdoc/install/2009/08/31/1133192.shtml