运河中央公园:系统初始化函数集(subsys_initcall)和初始化段应用
来源:百度文库 编辑:中财网 时间:2024/05/05 19:24:16
1 系统初始化调用函数集分析(静态)1.1 函数定义 在linux内核代码里,运用了subsys_initcall来进行各种子系统的初始化,具体怎么初始化的呢?其实并不复杂。以2.6.29内核作为例子。在
而__define_initcall又被定义为#define __define_initcall(level,fn,id) \ static initcall_t __initcall_##fn##id __used \ __attribute__((__section__(".initcall" level ".init"))) = fn
所以 subsys_initcall(fn) == __initcall_fn4 它将被链接器放于section .initcall4.init 中。(attribute将会在另一篇文章中介绍)1.2 初始化函数集的调用过程执行过程:start_kernel->rest_init系统在启动后在rest_init中会创建init内核线程init->do_basic_setup->do_initcallsdo_initcalls中会把.initcall.init.中的函数依次执行一遍:
for (call = __initcall_start; call < __initcall_end; call++) {. .....result = (*call)();. ........}
这个__initcall_start是在文件
INITCALLS被定义于
2 基于模块方式的初始化函数(动态)2.1函数定义subsys_initcall的静态调用方式应该讲清楚来龙去脉了,现在看看动态方式的初始化函数调用(模块方式)。在
2.2 module_init 分析下面先看看module_init宏究竟做了什么#define module_init(initfn) \ static inline initcall_t __inittest(void) \ /*定义此函数用来检测传入函数的类型,并在编译时提供警告信息*/ { return initfn; } \ int init_module(void) __attribute__((alias(#initfn))); /*声明init_modlue为 initfn的别名,insmod只查找名字为init_module函数并调用*/
typedef int (*initcall_t)(void); /*函数类型定义*/
在以模块方式编译一个模块的时候,会自动生成一个xxx.mod.c文件, 在该文件里面定义一个struct module变量,并把init函数设置为上面的init_module() 而上面的这个init_module,被alias成模块的初始化函数(参考
也就是说,模块装载的时候(insmod,modprobe),sys_init_module()系统调用会调用module_init指定的函数(对于编译成>模块的情况)。2.3 module的自动加载内核在启动时已经检测到了系统的硬件设备,并把硬件设备信息通过sysfs内核虚拟文件系统导出。sysfs文件系统由系统初始化脚本挂载到/sys上。udev扫描sysfs文件系统,根据硬件设备信息生成热插拔(hotplug)事件,udev再读取这些事件,生成对应的硬件设备文件。由于没有实际的硬件插拔动作,所以这一过程被称为coldplug。udev完成coldplug操作,需要下面三个程序: udevtrigger——扫描sysfs文件系统,生成相应的硬件设备hotplug事件。 udevd——作为deamon,记录hotplug事件,然后排队后再发送给udev,避免事件冲突(race conditions)。 udevsettle——查看udev事件队列,等队列内事件全部处理完毕才退出。要规定事件怎样处理就要编写规则文件了.规则文件是udev的灵魂,没有规则文件,udev无法自动加载硬件设备的驱动模块。它一般位于
3初始化段的应用这里给出一个简单的初始化段的使用例子,将a.c编译成一个动态库,其中,函数a()和函数c()放在两个不同的初始化段里,函数b()默认放置;编译main.c,链接到由a.c编译成的动态库,观察各函数的执行顺序。# cat a.c#include
int b(){ printf("b\n"); return 0;}
# cat main.c#include
# cat mk.shgcc -fPIC -g -c a.cgcc -shared -g -o liba.so a.ocp liba.so /lib/ -frgcc main.c liba.so ldconfig ./a.out# gcc -fPIC -g -c a.c# gcc -shared -g -o liba.so a.o# cp liba.so /lib/# gcc main.c liba.so # ldconfig # ./a.out acmainb
数据初始化函数
电脑 系统初始化问题
关于初始化系统
网络系统初始化失败
系统不能初始化声音
什么是应用系统初始化?
系统初始化失败!怎么回事啊
系统加电初始化失败
系统初始化失败,怎办!
什么是系统初始化发生错误
系统初始化的时候死机
AT89S52的系统初始化问题
NOKIA手机怎么系统初始化
C语言中图形初始化函数怎么用
c++中构造函数和初始化链表有什么区别.
图像复原,系统函数
初始化系统中的硬件设备是怎么回事呀
我打不开Winkawaks,系统显示不能初始化
什么叫初始化系统时出错?怎么办?
防黑客系统初始化错误[114]
什么是系统初始化发生错误 如何修
怎样还原到系统初始化(xp)
系统问题“管理单元初始化失败”
XP系统下,开机网卡初始化问题!