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 *