每一次深入一个技术问题,随着挖掘的深入,都发现其背后总有非常深的背景知识,甚至需要深入很多底层系统,这个过程有时会让自己迷失,会让自己忘记了当初的目的。
前言
在讨论内核如何解析内核参数之前,我们先了解一下如何给内核参数。详细的内核参数的使用说明,请参加内核文档 Documentation/kernel-parameters.txt,这里我简单总结如下:
假如有如下的cmdline传递给内核
mem=900M console=ttyS0,115200 foo=1 bar ramoops.size=0x8000 earlyprintk -- msg=hello test
- 内核只解析
--
字符以前的参数。 --
字符以后的参数,都会传递给init进程。- 如果内核遇到不能识别的参数时,且该参数中没有包含字符
.
,内核将会把它传递给init进程,如果参数中有=
字符时,内核会将该参数传递给init进程作为其环境变量。 - 模块可以通过两种方式传递参数:一个是命令行,一个是modprobe。
(kernel command line) usbcore.blinkenlights=1 (modprobe command line) modprobe usbcore blinkenlights=1
- 编译进内核的模块,需要使用命令行的方式给其传递参数。
- modprobe在加载内核模块时,会去查找
/proc/cmdline
来收集模块的参数,所以未编译进内核的可加载的模块也可以使用命令行来传递参数。 - 内核参数中,中划线
-
和下划线_
时等价的,例如,如下的两个参数时等价的log_buf_len=1M print-fatal-signals=1 log-buf-len=1M print_fatal_signals=1
- 如果参数的值中有空格,可以使用双引号将其包住,例如:
param="spaces in here"