欢迎来到Linux驱动开发的世界!很多初学者觉得编写内核驱动高不可攀,其实只要掌握了基本流程,你也能轻松添加自己的驱动。本文将带你一步步完成一个最简单的字符设备驱动,从Kconfig配置、编译,到加载验证并创建设备节点,全程干货,小白也能跟上。
首先你需要一台安装Linux系统的电脑(推荐Ubuntu),并准备好内核源码树。可以使用发行版自带的内核头文件,或从kernel.org下载完整源码。这里假设你已在内核源码目录(如/usr/src/linux)下工作。
# 安装必要工具sudo apt install build-essential linux-headers-$(uname -r)apt source linux-image-$(uname -r) 创建一个名为mydriver.c的文件,内容如下:
#include #include #include static int __init mydriver_init(void){printk(KERN_INFO "Hello, my driver loaded!");return 0;}static void __exit mydriver_exit(void){printk(KERN_INFO "Goodbye, my driver unloaded!");}module_init(mydriver_init);module_exit(mydriver_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Your Name");MODULE_DESCRIPTION("A simple example driver"); 这是一个典型的内核模块框架,包含初始化和退出函数。
在同级目录下创建Kconfig文件,添加以下内容:
config MY_DRIVERtristate "My First Driver"default mhelpThis is a simple example driver for learning.Say Y here to compile it into the kernel, or M to build it as a module. 这里定义了一个名为MY_DRIVER的配置项,类型为三态(不编译/编译进内核/编译为模块)。
创建Makefile文件:
obj-$(CONFIG_MY_DRIVER) += mydriver.o 这一行告诉内核构建系统,当CONFIG_MY_DRIVER被设置为y或m时,编译mydriver.c。
现在你需要将你的驱动目录加入内核的Kconfig体系中。假设你的驱动放在drivers/misc/下,编辑该目录的Kconfig和Makefile,添加:
# 在 drivers/misc/Kconfig 中添加source "drivers/misc/mydriver/Kconfig"obj-$(CONFIG_MY_DRIVER) += mydriver/ 然后运行make menuconfig,进入Device Drivers -> Misc devices,你应该能看到"My First Driver"选项,按M将其编译为模块(或按Y编译进内核)。保存退出。
执行以下命令编译模块:
make modules_preparemake M=drivers/misc/mydriver modules 如果一切顺利,你会得到mydriver.ko文件。
使用insmod加载模块:
sudo insmod mydriver.kolsmod | grep mydriverdmesg | tail 你应该在dmesg输出中看到"Hello, my driver loaded!"。使用rmmod mydriver卸载,会看到退出信息。
我们的驱动目前还没有与文件系统交互。要实现设备节点创建,需要注册一个字符设备并分配设备号。下面给驱动增加简单功能:
// 在 mydriver.c 中添加头文件和变量#include #include static dev_t my_dev;static struct cdev my_cdev;static int my_open(struct inode *inode, struct file *filp){printk(KERN_INFO "Device opened");return 0;}static int my_release(struct inode *inode, struct file *filp){printk(KERN_INFO "Device closed");return 0;}static struct file_operations my_fops = {.owner = THIS_MODULE,.open = my_open,.release = my_release,};static int __init mydriver_init(void){// 动态分配设备号alloc_chrdev_region(&my_dev, 0, 1, "mydriver");cdev_init(&my_cdev, &my_fops);cdev_add(&my_cdev, my_dev, 1);printk(KERN_INFO "mydriver loaded with major %d", MAJOR(my_dev));return 0;}static void __exit mydriver_exit(void){cdev_del(&my_cdev);unregister_chrdev_region(my_dev, 1);printk(KERN_INFO "mydriver unloaded");} 重新编译模块并加载。此时使用cat /proc/devices可看到"mydriver"及其主设备号。创建设备节点:
sudo mknod /dev/mydriver c 240 0 # 240替换为你实际的主设备号sudo chmod 666 /dev/mydriver 然后可以用简单的应用程序测试打开和关闭设备。更现代的方式是使用udev自动创建节点,这里不展开。
通过本文,你学会了如何从零开始编写一个Linux驱动,使用Kconfig配置选项,编译为模块,并手动创建设备节点。这为更复杂的驱动开发打下了基础。继续探索,你还可以实现读写函数、ioctl等。希望这篇教程对你有帮助!
关键词:Linux驱动开发、内核模块、Kconfig配置、设备节点创建
本文由主机测评网于2026-02-25发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260227035.html