开发 Linux 驱动模块(Kernel Module,LKM) 一般包括:准备环境、编写代码、编写 Makefile、编译、加载/卸载、调试几个阶段。下面给你一个从零到可用的完整入门指南。
查看内核版本:
uname -r
# 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
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(注意: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
printk(KERN_DEBUG "debug info\n");
MODULE_LICENSEprintf, malloc)file_operationsioctlsysfs / procfs如果你愿意,可以告诉我:
我可以直接给你对应类型的完整示例。