解决linux内核可扩展性和可维护性相对较差的缺陷
宏内核:关键功能和服务功能均在内核空间提供
微内核:内核空间只提供关键功能,服务功能在用户空间提供
使用insmod命令加载
使用rmmod命令卸载
内核模块的功能需要依赖内核提供的各种底层接口
1.下载linux内核源码
? github:
git clone https://github.com/Embedfire/ebf-buster-linux.git
? gitee:
git clone https://gitee.com/Embedfire/ebf-buster-linux.git
2.安装必要环境工具库
sudo apt install make gcc-arm-linux-gnueabihf gcc bison flex libssl-dev dpkg-dev lzop
3.一键编译内核
sudo ./make_deb.sh
4.获取编译出来的内核相关文件
/home/pi/build
- #include <linux/module.h>:包含内核模块信息声明的相关函数
- #include <linux/init.h>:包含了 module_init()和 module_exit()函数的声明
- #include <linux/kernel.h>:包含内核提供的各种函数,如printk
printf:glibc实现的打印函数,工作于用户空间
printk:内核模块无法使用glibc库函数,内核自身实现的一个类printf函数,但是需要指定打印等级。
- #define KERN_EMERG "<0>" 通常是系统崩溃前的信息
- #define KERN_ALERT "<1>" 需要立即处理的消息
- #define KERN_CRIT "<2>" 严重情况
- #define KERN_ERR "<3>" 错误情况
- #define KERN_WARNING "<4>" 有问题的情况
- #define KERN_NOTICE "<5>" 注意信息
- #define KERN_INFO "<6>" 普通消息
- #define KERN_DEBUG "<7>" 调试信息
查看当前系统printk打印等级:cat /proc/sys/kernel/printk
打印内核所有打印信息:dmesg
KERNEL_DIR:指向linux内核具体路径
export:导出变量给子Makefile使用
obj-m := <模块名>.o:定义要生成的模块
$(MAKE):Makefile的默认变量,值为make
选项”-C”:让make工具跳转到linux内核目录下读取顶层Makefile
M=:表示内核模块源码目录
$(CURDIR):Makefile默认变量,值为当前目录所在路径
make modules:执行Linux顶层Makefile的伪目标,它实现内核模块的源码读取并编译为.ko文件
make
make copy
insmod xxx.ko
Linux终端窗口
mobaxterm窗口
根据不同应用场合给内核模块传递不同参数,提高内核模块灵活性
module_param(name, type, perm)
内核模块可以共享导出的符号表
EXPORT_SYMBOL(sym)
cat /proc/kallsyms | grep xxx
所有内核模块统一放到"/lib/modules/内核版本"目录下
cp *.ko /lib/modules/内核版本
建立模块依赖关系:
depmod -a
查看模块依赖关系
cat /lib/modules/内核版本/modules.dep
加载模块及其依赖模块
modprobe xxx
卸载模块及其依赖模块
modprobe -r xxx