深入浅出 Linux 设备驱动编程之内核模块
相关专题: Linux 设备驱动程序开发入门
Linux 设备驱动属于内核的一部分,Linux 内核的一个模块可以以两种方式被编译和加载:
(1)直接编译进 Linux 内核,随同 Linux 启动时加载;
(2)编译成一个可加载和删除的模块,使用 insmod 加载(modprobe 和 insmod 命令类似,但依赖
于相关的配置文件),rmmod 删除。这种方式控制了内核的大小,而模块一旦被插入内核,它就和内核其
他部分一样。
下面我们给出一个内核模块的例子:
#include <linux/module.h> //所有模块都需要的头文件
#include <linux/init.h> // init&exit 相关宏
MODULE_LICENSE("GPL");
static int __init hello_init (void)
{
printk("Hello module init");
return 0;
}
static void __exit hello_exit (void)
{
printk("Hello module exit");
}
module_init(hello_init);
module_exit(hello_exit);
分析上述程序,发现一个 Linux 内核模块需包含模块初始化和模块卸载函数,前者在 insmod 的时候运
行,后者在 rmmod 的时候运行。初始化与卸载函数必须在宏 module_init 和 module_exit 使用前定义,否
则会出现编译错误。
程序中的 MODULE_LICENSE("GPL")用于声明模块的许可证。
如果要把上述程序编译为一个运行时加载和删除的模块,则编译命令为:
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux-2.4/include -c -o hello.o hello.c
由此可见,Linux 内核模块的编译需要给 gcc 指示-D__KERNEL__ -DMODULE -DLINUX 参数。-I 选
项跟着 Linux 内核源代码中 Include 目录的路径。
下列命令将可加载 hello 模块:
insmod ./hello.o
下列命令完成相反过程:
rmmod hello
如果要将其直接编译入 Linux 内核,则需要将源代码文件拷贝入 Linux 内核源代码的相应路径里,并
评论0