温馨提示×

如何开发linux驱动模块

小樊
55
2026-10-15 08:49:53
栏目: 智能运维

开发 Linux 驱动模块(Kernel Module,LKM) 一般包括:准备环境、编写代码、编写 Makefile、编译、加载/卸载、调试几个阶段。下面给你一个从零到可用的完整入门指南。


一、开发环境准备

1. 系统要求

  • Linux 系统(Ubuntu / CentOS / Debian 等)
  • 内核版本一致(非常重要)

查看内核版本:

uname -r

2. 安装内核头文件和编译工具

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

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

二、最简单的驱动模块示例

1. 创建文件 hello.c

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

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, Linux kernel module!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, Linux kernel module!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Linux driver");

三、编写 Makefile

创建 Makefile(注意:Tab 不是空格)

obj-m += hello.o

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

all:
	make -C $(KDIR) M=$(PWD) modules

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

四、编译驱动模块

make

成功后你会看到:

hello.ko

五、加载和卸载模块

加载模块

sudo insmod hello.ko

查看模块

lsmod | grep hello

查看内核日志

dmesg | tail

卸载模块

sudo rmmod hello

六、字符设备驱动(更常见)

如果你要写真正的驱动(如 LED、串口、传感器),通常是 字符设备驱动。

核心结构

struct file_operations fops = {
    .open = my_open,
    .read = my_read,
    .write = my_write,
    .release = my_release,
};

注册设备

register_chrdev(major, "mydev", &fops);

创建设备节点

mknod /dev/mydev c 240 0

七、调试与注意事项

1. 使用 printk

printk(KERN_DEBUG "debug info\n");

2. 常见错误

  • 内核版本不匹配 → 必崩
  • 忘记 MODULE_LICENSE
  • 使用用户态函数(如 printf, malloc)

3. 安全提示

  • 内核代码崩了 = 系统崩了
  • 建议在 虚拟机 / 开发板 上测试

八、推荐学习路径

  1. 模块机制(insmod / rmmod)
  2. 字符设备驱动
  3. file_operations
  4. ioctl
  5. 中断 / 定时器
  6. 设备树(ARM / 嵌入式)
  7. sysfs / procfs

如果你愿意,可以告诉我:

  • 你用的是 x86 还是 ARM
  • 是 学习用 还是 实际硬件驱动
  • 想写 字符设备 / 块设备 / 网络驱动

我可以直接给你对应类型的完整示例。

0 踩