linux内核模块

本文是我迭代学习的笔记,不保证内容的严谨性。

目录

1.linux内核模块简介
2.linux内核模块示例
3.内核模块加载/卸载原理

1. linux内核模块简介

由于linux内核需要支持多种功能模块或者硬件设备,而这些功能模块或者硬件设备在不同板子上千差万别。受存储空间的限制,不可能把linux支持所有设备的驱动一下全编译进去,所以linux提供了一种动态加载模块的方法linux内核模块(Linux Kernel Module,LKM)。编译的内核首先只包含满足基本需求的模块,各种设备的驱动均可在内核运行起来后,通过应用层按用户需求由用户自行决定要加载的内核模块和加载时间。

2. linux内核模块示例

#include <linux/init.h>
#include <linux/module.h>


//模块参数
static int hello_parament = 4000;	//默认值
module_param(hello_parament, int, S_IRUGO);

//符号导出
EXPORT_SYMBOL(hello_export_fun);
void hello_export_fun(void)
{
	do something;
}

//加载函数
static int __init hello_init(void)
{
	printk(KERN_INFO "Hello World enter
");
	return 0;
}
module_init(hello_init);

//卸载函数
static void __exit hello_exit(void)
{
	printk(KERN_INFO "Hello World exit
 ");
}
module_exit(hello_exit);

编译的Makefile

KVERS = $(shell uname -r)

# Kernel modules
obj-m += hello.o

# Specify flags for the module compilation.
#EXTRA_CFLAGS=-g -O0

build: kernel_modules

kernel_modules:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules

clean:
	make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

编译完成,得到hello.ko文件,此文件就是内核模块文件。

├── hello.c
├── hello.ko
├── hello.mod.c
├── hello.mod.o
├── hello.o
├── Makefile
├── modules.order
└── Module.symvers

0 directories, 8 files

insmod(安装 LKM),rmmod (删除 LKM),modprobe(insmod 和 rmmod 的包装器),depmod(用于创建模块依赖项),以及 modinfo(用于为模块宏查找值)。

使用insmod hello.ko加载模块,rmmod hello卸载模块,通过dmesg查看内核打印,可以看到分别加载模块和卸载模块时的打印信息。

sudo insmod hello.ko
sudo rmmod hello.ko

dmesg
...
...
[24283.807671] Hello World enter
[24289.517281] Hello World exit

内核模块参数就只指在insmod的时候可以由用户传递一个参数下去给内核模块,内核模块符号的导出指加载内核模块后,其他内核模块可以看得到此模块导出的符号,可以进行调用。

3. 内核模块加载/卸载原理

https://www.ibm.com/developerworks/cn/linux/l-lkm/index.html

原文地址:https://www.cnblogs.com/thammer/p/12539414.html