Linux操作系统内核是单内核,速度和性能都很高,如何提高可扩展性和可维护性?那就是模块机制。用户可以根据需要,在不需要对内核重新编译的情况下,可以将模块动态地载入或移出内核。
一、什么是模块?
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行。
模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称为模块。
二、模块编程基础知识
内核模式下编程的一些限制 :
- 不能使用用户模式下的C标准库。
- 不能使用浮点运算,因为linux内核切换模式时不保存处理器的浮点状态。
- 尽可能保持代码的清洁易懂,因为内核调试不方便。
- 模块编程和内核版本密切相连,不同的内核版本,某些函数的函数名会有变化。因此模块编程也可以说是内核编程。
- 只有超级用户才可以运行模块 。
用户层编程和内核模块编程的区别:
三、代码结构内容
第一部分: 模块程序的头文件
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
编写内核模块程序所必须的 3 个头文件 :
- module.h包含了对模块结构的定义及模块版本的控制
- kernel.h包含了常用的内核函数
- Init.h包含了模块的初始化的宏定义以及一些其他函数的初始化函数。如宏module_init等。
第二部分: 编写内核模块时必须要有的两个函数
①hello_init():注册函数(名字任起) 或模块的初始化函数。
static int hello_init( void )