linux内核模块
c吧
全部回复
仅看楼主
level 5
内核模块和应用程序
1、内核模块概念
内核模块是具有独立功能的程序。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。模块编程和内核版本密切相连,因为不同的内核版本中某些函数的函数名会有变化。因此模块编程也可以说是内核编程。模块本身不被编译进内核映像,从而控制了内核的大小;模块一旦被加载,就和内核中的其他部分完全一样。
2、应用程序和内核模块编程比较
3、hello world 驱动程序
驱动模块组成:
一个规范驱动模块应该包含的结构:(以下顺序是在源文件中顺序):
(1). 头文件(必选)
(2). 模块参数(可选)
(3). 模块功能函数(可选)
(4). 其他(可选)
(5). 模块加载函数(必须)
(6). 模块卸载函数(必须)
(7). 模块许可声明(必须)
示例如下:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("DAVID");
MODULE_DESCRIPTION("Hello world module");
static int __init hello_init(void)
{
printk(KERN_ERR "hello world!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_EMERG "hello exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
注意:代码中__init 和__exit 是 linux 内核的宏定义,使系统在初始化或卸载
完成后执行该函数,并释放其所占内存。
(1)头文件:
驱动模块需要使用内核中的许多函数,需要包含必要的头文件,以下两个
头文件是所有驱动模块都必须包含的
#include<linux/module.h> 加载模块时需要使用的大量符合和函数定义。
#include<linux/init.h> 模块加载函数和模块释放函数的宏定义。
(2)模块参数:
模块参数是驱动模块加载时,需要传递给驱动模块的参数。如果一个模块
需要完成两种功能,可以通过模块参数选择使用哪一种功能
(3)模块加载函数:
模块加载时,需要执行的函数
(4)模块卸载函数:
模块卸载时,需要执行的函数
(5)模块许可声明:
模块许可声明表示模块受内核支持的程度,有许可权的模块会更受开发人
员的重视。
2025年12月29日 07点12分 1
1