LDD3_NO.4:The Kernel Symbol Table

 The Kernel Symbol Table 内核符号表

      我们知道了insmod如何对应内核公共符号表来解决模块中的未定义的符号。表中包含了内核全局项(函数、变量)的地址,这些项要执行模块化驱动。当模块加载时,任何被模块输出的符号都变成内核符号表中的一部分。通常情况下,模块只是执行自己的功能,而不需要输出任何符号。不过,你需要输出模块,任何别的模块会得益于此。新的模块可以使用你的模块输出的符号,你也可以在其他模块的基础上建立新的模块。模块堆叠在主流的内核源代码中也被使用:MSDOS文件系统依赖于fat模块,每一个USB输入模块堆叠在usbcore和输入模块上。


     对于复杂的项目来说,模块堆叠很有用处。如果新的抽象以设备驱动的形式实现,它可能会提供硬件特性的插入点。比如:video-for-linux系列驱动分成了一个通用模块,并输出由针对特殊硬件的底层设备驱动程序使用的符号。根据设置,安装硬件需要加载通用video模块和特定模块。对并口和众多可接连设备的支持都以相同的方式,类似USB内核子系统。并口子系统的堆叠如图2-2.箭头表示模块和内核程序接口的通信。

 

 


     使用堆叠模块时,可以更好的理解modprobe命令。modprobe和insmod类似,但是他同时可以加载你需要的其他模块。所以modprobe命令有时候相当于几条insmod命令,不过你仍然需要在当前目录使用insmod命令加载自己的模块,因为modprobe命令只在已安装的标准模块目录中使用。
 

      Linux内核头文件提供了一个便利的方法管理符号,因而要减少名称空间污染(可能会和在内核的其他地方定义的符号冲突)、提升信息隐藏。如果模块要为其他内核添加符号,使用如下宏:
EXPORT_SYMBOL(name);

EXPORT_SYMBOL_GPL(name);


     这两个宏都可以使得指定的符号在模块外部可见。_GPL版本的宏表示只是对GPL许可的模块有作用。符号必须在模块文件的全局部分输出,在任何函数之外。因为宏定义扩展成一个有特殊用途的全局变量。

 

     每个可加载的模块中都包含两个头文件:

 

 

     module.h包含大量了加载模块时所需的符号和函数,init.h指定模块初始化和清除功能;有些模块还包含了moduleparam.h,允许在加载时给模块传递参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值