一、处理启动参数的相关宏定义
下述宏定义以及函数声明位于内核源码kernel-5.10/include/linux/init.h
1. __setup_param
宏
#define __setup_param(str, unique_id, fn, early) \
static const char __setup_str_##unique_id[] __initconst \
__aligned(1) = str; \
static struct obs_kernel_param __setup_##unique_id \
__used __section(".init.setup") \
__attribute__((aligned((sizeof(long))))) \
= {
__setup_str_##unique_id, fn, early }
str
: 是一个字符串,表示内核启动参数。unique_id
: 是一个唯一的标识符,用于生成内部变量名。fn
: 是一个函数指针,指向处理该启动参数的函数。early
: 是一个布尔值,表示该参数是否在早期处理。
这个宏定义了两个静态变量:
__setup_str_##unique_id
: 存储启动参数字符串,类型为const char[]
,并使用__aligned(1)
确保对齐。__setup_##unique_id
: 是一个struct obs_kernel_param
类型的结构体,存储在.init.setup
段中,并使用__attribute__((aligned((sizeof(long)))))
确保对齐。该结构体包含启动参数字符串指针、处理函数指针和早期处理标志。
struct obs_kernel_param {
const char *str;
int (*setup_func)(char *);
int early;
};
2. __setup
宏
#define __setup(str, fn) \
__setup_param(str, fn, fn, 0)
str
: 是一个启动参数字符串。fn
: 是处理该启动参数的函数。
这个宏调用 __setup_param
宏,并将 early
参数设置为 0
,表示该参数不是早期处理的。
3. early_param
宏