讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

Linux如何编写内核模块程序_LinuxKernelModule开发示例

云伟同学_7314

云伟同学_7314

发布时间:2025-11-25 17:22:02

|

607人浏览过

|

来源于php中文网

原创

首先准备开发环境并安装必要工具,然后编写包含初始化和退出函数的内核模块源码,接着创建使用Tab缩进的Makefile进行编译配置,通过make命令编译并用insmod加载模块,最后用dmesg查看输出、rmmod卸载模块;过程中需注意内核版本匹配、GPL声明及避免使用用户空间函数。

linux如何编写内核模块程序_linuxkernelmodule开发示例

编写Linux内核模块程序是深入理解操作系统机制的重要方式。它允许开发者在不重新编译整个内核的前提下,向内核添加新功能。下面通过一个简单的示例,介绍如何开发、编译和加载一个基础的内核模块。

1. 准备开发环境

确保系统已安装必要的开发工具和内核头文件:

  • Ubuntu/Debian: sudo apt install build-essential linux-headers-$(uname -r)
  • CentOS/RHEL: sudo yum install kernel-devel kernel-headers gcc make

这些组件提供了编译模块所需的Makefile规则和头文件支持。

2. 编写最简单的内核模块

创建一个名为 hello_module.c 的源码文件:

#include
#include
#include

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, Kernel Module Loaded!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, Kernel Module Unloaded!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World kernel module");
MODULE_VERSION("1.0");

说明:
- __init 标记初始化函数,模块加载后释放内存
- __exit 标记退出函数,静态链接时不导出
- printk 是内核态打印函数,使用 KERN_INFO 等级别控制日志输出
- 必须包含 GPL 许可证声明,否则加载时会警告

3. 编写 Makefile

在同一目录下创建 Makefile:

CMIC Skill Scanner (BCLinux 21 / 低版本 glibc Linux x64)
CMIC Skill Scanner (BCLinux 21 / 低版本 glibc Linux x64)

使用内置 Rust 引擎审计待安装的 skill 包或归档,可选桥接外部扫描器。

下载
obj-m += hello_module.o

KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd)

default: $(MAKE) -C $(KDIR) M=$(PWD) modules

clean: $(MAKE) -C $(KDIR) M=$(PWD) clean

install: sudo insmod hello_module.ko

remove: sudo rmmod hello_module

注意:Makefile 中缩进必须使用 Tab,不能用空格。

4. 编译与测试模块

执行以下命令完成编译和加载:

  • make —— 编译生成 hello_module.ko
  • make install —— 加载模块
  • dmesg | tail —— 查看内核日志输出
  • make remove —— 卸载模块
  • lsmod | grep hello_module —— 查看是否加载

正常情况下,加载时会在 dmesg 中看到 "Hello, Kernel Module Loaded!",卸载时显示再见信息。

5. 常见问题与调试技巧

内核模块开发容易遇到的问题包括符号未导出、版本不匹配、权限不足等。

  • 确保模块编译所用内核头文件与当前运行版本一致(uname -r)
  • 使用 modinfo hello_module.ko 查看模块信息
  • 若加载失败,查看 dmesg 输出错误原因
  • 避免在模块中使用用户空间函数(如 printf、malloc)

基本上就这些。掌握基本框架后,可以逐步尝试添加字符设备、proc 接口或中断处理等功能。不复杂但容易忽略细节。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

948

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7539

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3585

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4728

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

3145

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

391

2025.11.27

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn