printk的详细原理分析
2013-01-15 21:44
155 查看
设置命令行参数"console=ttySAC0" 它使得printk的信息从串口0中输出。那么内核是怎样根据命令行参数确定printk的输出设备呢?
在kernel/printk.c 中有如下代码:
__setup("console=", console_setup);
具体分析:
#define __setup(str, fn) \
__setup_param(str, fn, fn, 0)
#define __setup_param(str, unique_id, fn, early) \
static char __setup_str_##unique_id[] __initdata __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 }
将代码展开如下:
#define __setup_param("console=",console_setup,console_setup, 0) \
static char __setup_str_console_setup[] __initdata __aligned(1) =
"console="; \
static struct obs_kernel_param __setup_console_setup \
__used __section(.init.setup) \
__attribute__((aligned((sizeof(long))))) \
= { __setup_str_console_setup,
console_setup, 0 }
这段代码定义了两个变量:字符数组变量__setup_str_console_setup,其初始化内容为"console=",由于该变量用 __initdata修饰,它将被放入.init.data输入段;另一变量是结构变量__setup_console_setup,其类型为 struct obs_kernel_param, 该变理被放入输入段.init.setup中。结构struct struct obs_kernel_param也在该文件中定义如下:
struct obs_kernel_param {
const char *str;
int (*setup_func)(char *);
int early;
};
变量__setup_console_setup的三个成员分别被初始化为:
"console=" 通过宏__setup传递过来的字符串
console_setup 通过宏__setup传递过来的处理函数。
0 (不了解)
现在不难想像内核启动时怎么处理启动参数的了:通过__setup宏定义obs_kernel_param结构变量都被放入.init.setup段中,这样一来实际是使.init.setup段变成一张表,Kernel在处理每一个启动参数时,都会来查找这张表,与每一个数据项中的成员str进行比较,如果完全相同,就会调用该数据项的函数指针成员setup_func所指向的函数(该函数是在使用__setup宏定义该变量时传入的函数参数),并将启动参数如console=后面的内容传给该处理函数。
详细分析可见:
http://hi.baidu.com/btzxqusu/item/6238ff791a7a192ed7a89ccc
在kernel/printk.c 中有如下代码:
__setup("console=", console_setup);
具体分析:
#define __setup(str, fn) \
__setup_param(str, fn, fn, 0)
#define __setup_param(str, unique_id, fn, early) \
static char __setup_str_##unique_id[] __initdata __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 }
将代码展开如下:
#define __setup_param("console=",console_setup,console_setup, 0) \
static char __setup_str_console_setup[] __initdata __aligned(1) =
"console="; \
static struct obs_kernel_param __setup_console_setup \
__used __section(.init.setup) \
__attribute__((aligned((sizeof(long))))) \
= { __setup_str_console_setup,
console_setup, 0 }
这段代码定义了两个变量:字符数组变量__setup_str_console_setup,其初始化内容为"console=",由于该变量用 __initdata修饰,它将被放入.init.data输入段;另一变量是结构变量__setup_console_setup,其类型为 struct obs_kernel_param, 该变理被放入输入段.init.setup中。结构struct struct obs_kernel_param也在该文件中定义如下:
struct obs_kernel_param {
const char *str;
int (*setup_func)(char *);
int early;
};
变量__setup_console_setup的三个成员分别被初始化为:
"console=" 通过宏__setup传递过来的字符串
console_setup 通过宏__setup传递过来的处理函数。
0 (不了解)
现在不难想像内核启动时怎么处理启动参数的了:通过__setup宏定义obs_kernel_param结构变量都被放入.init.setup段中,这样一来实际是使.init.setup段变成一张表,Kernel在处理每一个启动参数时,都会来查找这张表,与每一个数据项中的成员str进行比较,如果完全相同,就会调用该数据项的函数指针成员setup_func所指向的函数(该函数是在使用__setup宏定义该变量时传入的函数参数),并将启动参数如console=后面的内容传给该处理函数。
详细分析可见:
http://hi.baidu.com/btzxqusu/item/6238ff791a7a192ed7a89ccc
相关文章推荐
- 第四篇:WordCount运行原理结合代码详细分析
- JPEG 原理详细实例分析(转)
- 2014.4新版uboott的relocation原理详细分析
- 硬盘 FAT 文件系统原理的详细分析
- Java ClassLoader 原理详细分析
- OSSEC主要功能及原理+详细配置+日志文件分析
- 从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- VLC视频播放器原理详细分析含TS流格式分析
- Java ClassLoader 原理详细分析
- VLC视频播放器原理详细分析含TS流格式分析
- libpcap丢包原理分析及Fedora 9 内核2.6.25.14下安装PF-RING的详细过程
- java动态代理实现与原理详细分析
- JNI技术实践小结--原理分析和详细步骤截图说明
- uboot的relocation原理详细分析
- VLC视频播放器原理详细分析含TS流格式分析
- JPEG 原理详细实例分析及其在嵌入式 Linux 中的应用
- 详细分析spring与struts2的整合原理
- linux-2.6.32在mini2440开发板上移植---触摸屏工作原理以及驱动程序详细分析
- uboot的relocation原理详细分析