Linux内核模块开发:hello world模块编写 | linux-tutorial

Linux内核模块开发:hello world模块编写 | linux-tutorial

【免费下载链接】linux-tutorial :penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本 【免费下载链接】linux-tutorial 项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial

一、为什么需要内核模块

你是否曾想过:为什么安装某些驱动时不需要重启系统?为什么有些功能可以动态添加到Linux内核中?答案就藏在内核模块(Kernel Module) 技术里。

内核模块是一种可以在系统运行时动态加载到内核中的代码,它扩展了Linux内核的功能,却不需要重新编译内核或重启系统。这对设备驱动开发、文件系统扩展等场景至关重要。

二、环境准备

2.1 安装开发依赖

首先需要安装内核头文件和编译工具:

# Ubuntu/Debian系统
sudo apt-get install linux-headers-$(uname -r) build-essential

# CentOS/RHEL系统
sudo yum install kernel-devel gcc make

相关工具脚本可参考:系统工具安装脚本

2.2 查看内核版本

确认内核版本和头文件是否匹配:

uname -r          # 查看内核版本
ls /lib/modules/$(uname -r)/build  # 确认头文件目录

三、编写第一个内核模块

3.1 模块源代码

创建文件 hello.c,内容如下:

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

// 模块加载函数
static int __init hello_init(void) {
    printk(KERN_INFO "Hello, World! 内核模块加载成功\n");
    return 0; // 0表示加载成功
}

// 模块卸载函数
static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, World! 内核模块卸载成功\n");
}

// 模块注册
module_init(hello_init);
module_exit(hello_exit);

// 模块元信息
MODULE_LICENSE("GPL");           // 许可证声明(必须)
MODULE_AUTHOR("Linux Tutorial"); // 作者信息
MODULE_DESCRIPTION("Hello World内核模块示例"); // 模块描述
MODULE_VERSION("0.1");           // 模块版本

3.2 Makefile编写

创建 Makefile,内容如下:

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

四、编译与加载模块

4.1 编译模块

执行编译命令:

make

编译成功后会生成 hello.ko 文件(这就是我们的内核模块)。

4.2 加载模块

sudo insmod hello.ko

4.3 查看模块是否加载

lsmod | grep hello

4.4 查看模块输出信息

内核模块的输出信息不会显示在终端,而是记录在系统日志中:

dmesg | grep "Hello, World"

4.5 卸载模块

sudo rmmod hello

再次查看日志确认卸载信息:

dmesg | grep "Goodbye, World"

五、核心代码解析

5.1 模块入口与出口

  • module_init(hello_init): 指定模块加载时执行的函数
  • module_exit(hello_exit): 指定模块卸载时执行的函数

5.2 printk函数

printk 是内核态的打印函数,与用户态的 printf 类似,但有以下区别:

  • 必须指定日志级别(如 KERN_INFO
  • 输出到内核环形缓冲区,需用 dmesg 命令查看
  • 不支持浮点数格式化

5.3 模块元信息

  • MODULE_LICENSE: 声明模块许可证,常用GPL
  • MODULE_AUTHOR: 作者信息
  • MODULE_DESCRIPTION: 模块功能描述
  • MODULE_VERSION: 模块版本号

六、常见问题解决

6.1 编译错误:找不到内核头文件

确保已安装对应版本的内核头文件:

sudo apt-get install linux-headers-$(uname -r)

相关脚本参考:系统设置脚本

6.2 权限问题

加载/卸载模块需要root权限,必须使用 sudo

6.3 模块依赖

如果模块依赖其他模块,需先加载依赖模块。可使用 modinfo hello.ko 查看模块依赖。

七、进阶学习资源

  1. Linux内核模块开发官方文档
  2. 内核模块Makefile编写指南
  3. 实用Shell脚本集合
  4. 系统运维手册

八、总结

本文介绍了Linux内核模块的基本概念,通过一个简单的"hello world"示例,展示了内核模块的编写、编译、加载和卸载过程。内核模块是Linux系统中非常强大的功能,掌握它将为你打开设备驱动开发、内核调优等领域的大门。

想要深入学习?可以继续探索:

  • 模块参数传递
  • 内核线程创建
  • 设备文件操作
  • 内核调试技术

开始你的内核探索之旅吧!

【免费下载链接】linux-tutorial :penguin: Linux教程,主要内容:Linux 命令、Linux 系统运维、软件运维、精选常用Shell脚本 【免费下载链接】linux-tutorial 项目地址: https://gitcode.com/GitHub_Trending/lin/linux-tutorial

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值