linux之可安装模块机制

 一、背景:

1.系统可见设备、应用可访问设备,需要具备设备文件节点,设备驱动

2.所有设备驱动程序静态链接到内核会导致内核过大, 不易运行

 linux之可安装模块机制_设计制作_MEMS/传感技术

二、特点:

1.可安装模块(module)是编译不链接

2.运行后,动态加载到内核中

3.加载操作由内核或者特权用户使用sbin执行

4.机制支持选择CONFIG_MODULES

二、源码分析:

init/m     ai   n.c

asmlinkage void __init start_kernel(void)
{

...

rest_init();

...

}

sta     ti   c noinline void __init_refok rest_init(void)
{

...

kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

...

}

sta  TI c int __init kernel_init(void * unused)
{

...

do_b     asic   _setup();

...

}

sta  TI c void __init do_basic_setup(void)
{
...
do_initcalls();
}

sta  TI c void __init do_initcalls(void)

{
initcall_t *fn;

for (fn = __early_initcall_end; fn < __initcall_end; fn++)
do_one_initcall(*fn);
}

#define INITCALLS       \
*(.initcallearly.init)      \
VM     LINUX   _SYMBOL(__early_initcall_end) = .;   \
*(.initcall0.init)      \
*(.initcall0s.init)      \
*(.initcall1.init)      \
*(.initcall1s.init)      \
*(.initcall2.init)      \
*(.initcall2s.init)      \
*(.initcall3.init)      \
*(.initcall3s.init)      \
*(.initcall4.init)      \
*(.initcall4s.init)      \
*(.initcall5.init)      \
*(.initcall5s.init)      \
*(.initcallrootfs.init)      \
*(.initcall6.init)      \
*(.initcall6s.init)      \
*(.initcall7.init)      \
*(.initcall7s.init)

#define INIT_CALLS       \
VMLINUX_SYMBOL(__initcall_start) = .;   \
INITCALLS      \
VMLINUX_SYMBOL(__initcall_end) = .;

#define INIT_DATA_SEC  TI ON(initsetup_align)    \
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {  \
INIT_DATA      \
INIT_SETUP(initsetup_align)    \
INIT_CALLS      \
CON_INITCALL      \
SECURITY_INITCALL     \
INIT_     RAM   _FS      \
}

即,从init.data段中取出初始化部分的代码,驱动在初始化时期进行加载

module_init(camera_init);

include\linux\init.h

#define module_init(x) __initcall(x);

#define __initcall(fn) device_initcall(fn)

#define device_initcall(fn)  __define_initcall("6",fn,6)

#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __used \
__attribu     te   __((__section__(".initcall" level ".init"))) = fn

此处与系统启动加载时期对应,即将驱动代码放入.initcall" level ".init段



82
87
0
81

相关资讯

  1. 1、《北纬30度》央视一套热播记者李七月感受幸福4341
  2. 2、豆瓣3.9,《八月未央》热映,口碑扑街,网友:不出所料的烂片3256
  3. 3、《浮沉》导演10月拍第二部电影仍与白百何合作346
  4. 4、被质疑蹭李小璐热度,甜馨舅舅怒挂私信2504
  5. 5、各卫视播《浮沉》压片头为收视率观众受不了2439
  6. 6、吴镇宇演《猎仇者》入魂现场爆粗怒骂邓紫衣3151
  7. 7、甄子丹不缺钱和名,为什么还要拍烂片?背后原因,让人心酸1280
  8. 8、余男解读《全民目击》人物谱与孙红雷关系最纠结1199
  9. 9、东宫大火之后,彭小苒两年无戏可拍,最近进组造型却被吐槽1356
  10. 10、王俊凯精神上有多抑郁?在拍摄《断桥》期间,被要求永远不能再笑3958
全部评论(0)
我也有话说
0
收藏
点赞
顶部