从本章开始引入所有关于模块和内核编程的基本概念,并编写一个完整模块来实践这些基本的概
念。
3.1 搭建测试环境
由于所有测测试代码都是基于Ubuntu 14.04.2 Desktop的3.16.0-30-generic内核,所以最好是到
Linux官方网站去下载一份该版本内核的源代码。另外,建议在虚拟机里面安装你的Ubuntu桌面环境,这
样避免因为误操作造成硬件损坏或者重要数据丢失。更多测试环境搭建细节可参考博文:
Ubuntu 14.04.2 + Vmware搭建Linux驱动开发环境
3.2 Hello World模块
下面的代码是一个完整的Hello World模块。
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel world\n"); } module_init(hello_init); module_exit(hello_exit);
该模块有两个函数,hello_init()在模块加载到内核时被调用,hello_exit()在模块从内核移除是被调用。
宏module_init和module_exit分别将函数hello_init()和hello_exit()放入两个特定的段(section)内,这样模块在被链接到内核时,内核能够知道它们分别是用于模块加载/移除的函数。而宏MODULE_LICENSE声明
了模块的许可权限,同时,如果不做许可声明,内核会有所抱怨。
时间: 2024-10-29 05:03:19