用个新的开始,记录学习过程
从写一个字符设备节点开始,第一步写个helloworld。
一个最简单的内核模块
Module
作用:使编译出来的内核本身不需要包含所有需要的功能,这些功能在使用时,其对应的代码被动态得加载到内核中。
特点:模块本身不被变一如内核映像,从而控制内核大小;模块一旦被加载,它就和内核中的其他部分完全一样。
static int __init ××__init(void):
模块加载函数,当通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成
本模块的相关初始化工作。
static void __exit ××__exit(void):
模块卸载函数:当通过rmmod命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的
过程。
MODULE_LICENSE("GPL v2"):
模块许可证声明:许可证声明描述内核模块的许可权限,如果不生命LICENSE,模块加载时,将收到内核被污染
(Kernel Tainted)的警告
代码实例
#include <linux/init.h>
#include <linux/module.h>
static int __init helloworld_init(void)
{
printk(KERN_ALERT "Hello, World!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_ALERT "bye bye!\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL v2");