Linux模块编程系列之一 编译与安装

1.编译相关的问题

为了区别与应用程序,内核模块在编译的时候都需要定义如下几个宏

__KERNEL__

MODULE

由于内核中有很多inline限定的函数,所以在编译的时候,应该对编译器的优化机制有所了解。GCC通过带参数-On(01234)告知编译器优化等级。如果不做优化,那么inline将不起作用;但在-O2以上,GCC主动的将某些非inline函数内联,也将导致问题,所以编译模块时,应将优化等级设在-O –O2之间,以确保inline特性的正确性。

如果模块由多个.c文件实现,最终需要把多个由.c生成的.o文件组合成一个文件。这个时候可以用ld –r来实现.-r(relocateable)告诉ld,不需要做link动作(link的时候会去找每个符合的定义),只是把输入的文件重新定位,产生一个输出文件。

2. 内核的版本

<linux/version.h>中定义了与版本相关的几个宏

#define UTS_RELEASE " 2.4.20 -8"  string形式的版本号

#define LINUX_VERSION_CODE 132116 int 型的版本号

#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

通过主版本号a,副版本号b与修改号c生成版本号

 

3. 创建设备节点

如何模块注册了一个设备(register_char_device),在正确安装后,会在/proc/device文件下写一条记录,可以查阅模块的major number,名字和类型。为了方便应用程序操作该设备,需要在/dev下面创建相应的节点。可以用mknod创建一个设备节点。例如在/proc/device里有一条mymod的记录,通过如下方式创建其在/dev下的对应节点:

 

Major_number = cat /proc/device | awk “/$2=mymod {print /$1}”

mknod /dev/mynod c $Major_number 0

c – 字符设备

$Major_number – 主版本号

0 – 从版本号,系统只认主版本号,从版本可自行定制 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值