Linux源码 command line
阅读数:365 评论数:0
跳转到新版页面分类
Linux
正文
一、概述
在Linux内核源代码中,command_line
是一个字符串,它包含了在引导时传递给内核的启动参数。这些参数可以在内核启动时由引导加载器(如GRUB)设置,也可以在编译内核时静态设置。
启动参数可以用来通知内核启动时的各种设置,比如内存大小、根文件系统的位置、各种硬件的配置选项等。这些参数对于内核的初始化和运行至关重要。
在内核代码中,启动参数被解析,并且相应的内核变量会被设置。在内核初始化的早期阶段,会调用一个名为parse_early_param
的函数来处理标记为early_param
的参数。稍后,parse_args
函数会被调用来处理剩余的参数。
如果你想查看内核中command_line
的使用,你可以查找内核源代码中的do_early_param
和parse_args
函数。这些函数会遍历command_line
字符串,并且对于每个找到的参数,它们会尝试调用相应的处理函数。
要查看实际传递给你的Linux系统内核的启动参数,你可以查看/proc/cmdline
文件
cat /proc/cmdline
二、内核代码相关分析
1、内核全局变量
- command_line
- default_command_line
- saved_command_line
内核参数的解析一共有两处,一处是setup_arch()->parse_cmdline()用于解析内核参数中关于内存的部分,另外一处是start_kernel()->parse_option()用于解析其余部分。
解析配置
根据执行的先后顺序,可以将处理函数分为三个大类,他们分别存在于下面三个段:
__setup_start = .; *(.init.setup) __setup_end = .;
__early_begin = .; *(.early_param.init) __early_end = .;
__start___param = .; *(__param) __stop___param = .;
这三个段存储的不是参数,而是command line参数所需要的处理函数。
2 .early_param.init段
它所处理的参数例如:initrd=, cachepolicy=, nocache, nowb, ecc=, vmalloc=, mem=等等。
这些处理函数是通过__early_param宏来定义的,例如:
static void __init early_initrd(char **p)
{ …… }
__early_param("initrd=", early_initrd);
3 .init.setup段
它所处理的参数例如:nfsroot=, ip=等等。
这些处理函数是通过__setup宏来定义的。
static int __init nfs_root_setup(char *line)
{ …… }
__setup("nfsroot=", nfs_root_setup);
4、相关变量
(1)default_command_line:
保存menuconfig配置的参数,如果bootloader传入了命令行参数,那么这个新的配置将被更新到该变量中。
(2)command_Line
存在于.init.data段,在parse_cmdline()中被赋值,数据来源是default_command_line
(3)saved_command_line
用于保存没有处理过的命令行参数,是boot_command_line的拷贝
(4)static_command_line
是command_line的拷贝。