Linux Kernel Module编程指南:从Hello World开始

Linux Kernel Module编程指南:从Hello World开始

【免费下载链接】lkmpg The Linux Kernel Module Programming Guide (updated for 5.0+ kernels) 【免费下载链接】lkmpg 项目地址: https://gitcode.com/gh_mirrors/lk/lkmpg

引言

Linux内核模块开发是深入操作系统核心的编程领域,它允许开发者在不重新编译整个内核的情况下扩展内核功能。本文将基于sysprog21/lkmpg项目中的内容,带领读者从零开始学习Linux内核模块开发,重点讲解最基础的"Hello World"模块实现。

什么是内核模块?

内核模块(Kernel Module)是可以在运行时动态加载到内核中的代码片段,它们能够扩展内核功能而无需重启系统。与传统的用户空间程序不同,内核模块运行在内核空间,具有直接访问硬件和系统资源的权限。

关键特点:

  • 动态加载/卸载:无需重新编译内核或重启系统
  • 运行在内核空间:拥有更高的权限但风险也更大
  • 通常用于设备驱动、文件系统等核心功能

开发环境准备

在开始编写第一个内核模块前,需要确保系统已安装必要的开发工具和内核头文件:

安装编译工具

# Ubuntu/Debian
sudo apt-get install build-essential kmod

# Arch Linux
sudo pacman -S gcc kmod

安装内核头文件

# Ubuntu/Debian
sudo apt-get install linux-headers-`uname -r`

# Arch Linux
sudo pacman -S linux-headers

第一个内核模块:Hello World

下面是最简单的内核模块实现,它将在加载时打印"Hello World"消息,在卸载时打印"Goodbye World"。

源代码 (hello-1.c)

#include <linux/module.h>   // 所有模块都需要
#include <linux/printk.h>   // 用于printk函数

// 模块初始化函数
int init_module(void)
{
    pr_alert("Hello World\n");
    return 0;
}

// 模块清理函数
void cleanup_module(void)
{
    pr_alert("Goodbye World\n");
}

MODULE_LICENSE("GPL");  // 声明模块许可证

Makefile

obj-m += hello-1.o

PWD := $(CURDIR)

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

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

注意:Makefile中的缩进必须使用制表符(Tab)而非空格。

编译与测试

  1. 编译模块:
make
  1. 加载模块:
sudo insmod hello-1.ko
  1. 查看已加载模块:
lsmod | grep hello
  1. 查看内核日志:
journalctl --since "1 hour ago" | grep kernel
  1. 卸载模块:
sudo rmmod hello_1

关键概念解析

1. 模块生命周期函数

  • init_module(): 模块加载时自动调用的初始化函数
  • cleanup_module(): 模块卸载时自动调用的清理函数

在现代内核版本中,可以使用任意名称的函数作为模块入口点,但需要配合module_init()module_exit()宏使用(后续章节会介绍)。

2. 内核日志输出

使用pr_alert()宏输出日志信息,它是对printk()的封装。内核日志与用户空间的printf()不同:

  • 输出到内核日志缓冲区
  • 需要指定日志级别(如ALERT、INFO等)
  • 在控制台或通过dmesg/journalctl查看

3. 模块元信息

MODULE_LICENSE("GPL")声明模块许可证,这是必要的元信息。其他常见元信息还包括作者、描述等。

常见问题解决

  1. 模块版本不匹配:确保内核头文件版本与运行内核一致
  2. SecureBoot限制:开发时可暂时禁用SecureBoot
  3. 环境变量问题:使用sudo -E保留环境变量或修改sudoers配置

安全注意事项

内核模块开发需要格外小心:

  • 错误的指针操作可能导致系统崩溃
  • 资源泄漏会影响系统稳定性
  • 建议在虚拟机中测试新模块

进阶方向

掌握了基础模块开发后,可以进一步学习:

  • 字符设备驱动开发
  • 内核同步机制(锁、信号量等)
  • 内核内存管理
  • 中断处理

结语

本文介绍了Linux内核模块开发的基础知识,通过最简单的"Hello World"示例展示了模块的基本结构和开发流程。内核模块开发是深入理解Linux操作系统的重要途径,也是开发设备驱动等系统级软件的必备技能。后续我们将继续探讨更复杂的内核模块开发技术。

【免费下载链接】lkmpg The Linux Kernel Module Programming Guide (updated for 5.0+ kernels) 【免费下载链接】lkmpg 项目地址: https://gitcode.com/gh_mirrors/lk/lkmpg

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

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

抵扣说明:

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

余额充值