cmdline代码分析
先介绍gcc的两个属性__attribute__和aligned
1. __attribute__ 为修饰对象的属性以及改变其类型;aligned(m),为m字节对齐。
sizeof(int) = 4; sizeof(char) = 1 ;sizeof (char *) = 8;
struct stu {
char name[5];
int length;
//char *sex;
};//__attribute__((aligned(8)));
上述sizeof(stu) = 12,结构体储存有一条规则是按照成员变量最大的对齐,由于int为4字节,因此4个char储存为4个字节,另外一个char也要储存为4个字节(即其它3个字节padding)。
struct stu {
char name[5];
int length;
//char *sex;
} __attribute__((aligned(8)));
上述sizeof(stu) = 16
struct stu {
char name[13];
int length;
//char *sex;
} __attribute__((aligned(8)));
上述sizeof(stu) = 24
2.cmdline代码分析
下面是以kernel 4.14版本进行分析,在现有的版本cmdline都是在kernel CONFIG里面配置,比如:
CONFIG_CMDLINE="mem=128M console=tty0 console=ttySC0,115200 ip=bootp root=/dev/nfs nfsroot=192.168.0.1:/home/rootfs"
那么这个参数,怎么传递给kernel呢?
先上几个常见的宏:
#define __init __section(.init.text) __cold notrace
#define __initdata __section(.init.data)
#define __initconst __section(.init.rodata)
#define __exitdata __section(.exit.data)
#define __exit_call __used __section(.exitcall.exit)
在init/main.c中定义了一个全局变量char __initdata boot_command_line[COMMAND_LINE_SIZE];,该变量储存在section中的.init.data数据段中,COMMAND_LINE_SIZE =2048,这个boot_command_line会在init/main.c里面去解析,做出相应的load函数。
而在解析dtb的源文件中的drivers/of/fdt.c,可以找到boot_command_line该变量;然后改变量可以得到dts里面的CONFIG_CMDLINE字符串值。
代码分析如下:
#ifdef CONFIG_CMDLINE
static const char *config_cmdline = CONFIG_CMDLINE;
Linux内核启动参数解析:cmdline、_setup宏与core_param

本文深入分析了Linux内核启动过程中cmdline参数的处理,探讨了gcc的内存对齐规则,并详细解释了_setup宏和core_param在配置参数传递给内核过程中的作用。通过代码解析,展示了从dts到内核初始化函数的过程,涉及的关键结构体、函数和宏的使用。
最低0.47元/天 解锁文章
1290

被折叠的 条评论
为什么被折叠?



