GoDm@'s Blog

Linux内核模块初体验

版权信息

warning

本文章为博主原创文章。遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


本篇摘自野火嵌入式Linux系列教程驱动开发篇

内核模块基本概念

现代内核派系

单内核:关键功能和服务功能均在内核空间提供

微内核:内核空间只提供关键功能,服务功能在用户空间提供

linux属于单内核,按理来说扩展性不好,但其的模块化设计又弥补了这一点。

内核模块加载/卸载

内核模块入口/出口

内核模块信息声明

内核模块实验1

实验环境

编译4.19.71版本内核

内核模块的功能需要依赖内核提供的各种底层接口

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

如果在电脑上编译不成功且无法解决,可以选择在开发板上编译,代价就是。。。嗯 it takes a long time

4.获取编译出来的内核相关文件

YOURPATH/ebf_linux_kernel_6ull_depth1/build_image/

内核模块头文件

内核模块打印函数

查看当前系统printk打印等级:cat /proc/sys/kernel/printk
输出

7       4       1       7

表示:

小于等于设定打印等级的消息不会被打印。
打印内核所有打印信息:dmesg

源码展示

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
static int __init hello_init(void){
    printk(KERN_EMERG"[KERN_EMERG]Hello Kernel!\n");
    printk("[DEFAULT]Hello Kernel!\n");
    return 0;
}

static void __exit hello_exit(void){
    printk("[DEFAULT]Goodbye Kernel!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("MIT");
MODULE_AUTHOR("gdm");
MODULE_DESCRIPTION("print: hello kernel");
MODULE_ALIAS("test_module");

Makefile分析

# 定义内核路径
KERNEL_DIR:=/home/debian/linux/driver_learning/ebf_linux_kernel_6ull_depth1/build_image/build
# 定义编译工具集
ARCH:=arm
CROSS_COMPILE:=arm-linux-gnueabihf-
# 将变量导出,相当于作为环境变量,让内核Makefile继承此变量 否则变量只在当前文件可见。
export ARCH CROSS_COMPILE
# 内核模块编译的标准变量,告诉内核编译哪个模块。
obj-m:=hellokernal.o
# -C 命令指切换到目标目录的makefile
# M= 可以理解为module,指定模块所在路径
# modules 是内核makefile定义的目标,触发“构建外部模块”完整规则
all:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) moudules
.PHONY:clean
clean:
    $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean

编译内核模块

make

开发板加载内核模块

insmod xxx.ko

共计约1.3k字。于2025/09/27首次发布,最后更新于2025/10/11。

本文章为博主原创文章。遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

#内核 | #内核编程 |
  1. 内核模块基本概念
    1. 现代内核派系
    2. 内核模块加载/卸载
    3. 内核模块入口/出口
    4. 内核模块信息声明
  2. 内核模块实验1
    1. 实验环境
    2. 编译4.19.71版本内核
    3. 内核模块头文件
    4. 内核模块打印函数
    5. 源码展示
    6. Makefile分析
    7. 编译内核模块
    8. 开发板加载内核模块