第四章 Linux内核模块

4.1 Linux内核模块简介

内核模块特点:

1)模块本身不被编译进内核映像中,从而控制内核的大小。

2)模块被加载后,它跟内核中的其他部分完全一样。

内核加载命令:

lsmod

内核卸载命令:

rmmod

加强型内核加载函数:

modprobe——优点:加载模块所以来的模块。

模块之间的依赖关系可以在:/lib/modules//modules.dep文件中。它是在编译内核时由depmod工具生成的。

查看模块信息的命令:

modinfo


4.2 Linux内核模块程序结构

1)模块加载函数

2)模块卸载函数

3)模块许可证声明

4)模块参数(可选)

5)模块导出符号(可选)

6)模块作者等信息声明(可选)


4.3 模块加载函数

linux内核模块加载函数一般以__init标识声明。

所有标识为__init的函数如果直接编译进内核,

module_init{fun_name}

成功返回0,失败返回错误编码。

在内核内部,可以使用requeset_module(module_name)加载其他内核模块。成为内核的一部分,在连接时都会放在.init.text区段,并且所有的__init函数在.initcall.init中还保存了一份函数指针,在初始化时,内核会通过这些函数指针调用__init函数,并在初始化完成后,释放init区段,包括.init.text、.initcall.init)


4.4 模块卸载函数

module_exit{fun_name}

linux内核模块加载函数一般以__exit标识声明,用__exit修饰模块卸载函数的作用是告诉内核如果相关的模块被直接编译进内核,则cleanup_function()会被圣罗,直接不链进最后的镜像。即标识该模块被内置了,不能卸载,所以卸载函数也就没有必要存在了。


4.5 模块参数

module_param(name, type, 权限)


4.6 导出符号

EXPORT_SYMBOL(符号名)

EXPORT_SYMBOL_GPL(符号名)

导出的符号可以被其他模块使用,只需要提前声明即可。


4.7模块声明与描述


4.8 模块的使用计数


4.9 模块的编译


4.10 使用模块绕开GPL

你可能感兴趣的:(学习笔记)