Linux Primer

Dive into linux kernel

How to Parse Linux Kernel Parameters

| Comments

每一次深入一个技术问题,随着挖掘的深入,都发现其背后总有非常深的背景知识,甚至需要深入很多底层系统,这个过程有时会让自己迷失,会让自己忘记了当初的目的。

前言

在讨论内核如何解析内核参数之前,我们先了解一下如何给内核参数。详细的内核参数的使用说明,请参加内核文档 Documentation/kernel-parameters.txt,这里我简单总结如下:

假如有如下的cmdline传递给内核

mem=900M console=ttyS0,115200 foo=1 bar ramoops.size=0x8000 earlyprintk -- msg=hello test
  1. 内核只解析--字符以前的参数。
  2. --字符以后的参数,都会传递给init进程。
  3. 如果内核遇到不能识别的参数时,且该参数中没有包含字符.,内核将会把它传递给init进程,如果参数中有=字符时,内核会将该参数传递给init进程作为其环境变量。
  4. 模块可以通过两种方式传递参数:一个是命令行,一个是modprobe。
     (kernel command line) usbcore.blinkenlights=1
     (modprobe command line) modprobe usbcore blinkenlights=1
    
  5. 编译进内核的模块,需要使用命令行的方式给其传递参数。
  6. modprobe在加载内核模块时,会去查找/proc/cmdline来收集模块的参数,所以未编译进内核的可加载的模块也可以使用命令行来传递参数。
  7. 内核参数中,中划线-和下划线_时等价的,例如,如下的两个参数时等价的
     log_buf_len=1M print-fatal-signals=1
     log-buf-len=1M print_fatal_signals=1
    
  8. 如果参数的值中有空格,可以使用双引号将其包住,例如:
     param="spaces in here"
    

第一个阶段

第二个阶段

第三个阶段

Comments