快捷搜索:   nginx

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

1.编译相关的问题

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

__KERNEL__

MODULE

由于内核中有很多inline限定的函数,所以在编译的时候,应该对编译器的优化机制有所了解。GCC通过带参数-On(0,1,2,3,4)告知 编译器优化等级。如果不做优化,那么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)

您可能还会对下面的文章感兴趣:

最新评论