项目简介
本项目专注于嵌入式Linux设备驱动开发,深入介绍Linux内核架构、内核模块原理与应用,着重展示设备驱动开发过程。通过丰富示例代码,详细阐述字符设备驱动实现,涵盖模块信息设置、设备号分配、设备文件创建、文件操作实现,以及等待队列、内核同步机制和定时器等高级特性使用,为开发者提供完整的嵌入式Linux设备驱动开发学习与实践方案。
项目的主要特性和功能
- Linux内核架构解析:讲解Linux用户空间与内核空间交互机制,以及内核模块加载与卸载原理,助开发者理解内核运行机制。
- 设备驱动类型展示:介绍字符设备、块设备和网络设备三种驱动类型,让开发者了解不同类型设备驱动特点与应用场景。
- 设备驱动开发流程演示:从“Hello World”内核模块起步,展示设备驱动开发完整流程,包括模块信息设置、初始化与退出函数编写、设备号分配与管理、设备文件创建与操作等。
- 高级特性实现:
- 等待队列:实现进程睡眠与唤醒机制,处理等待特定事件场景。
- 内核同步:利用互斥锁、信号量、自旋锁和完成变量等机制,解决多线程或多进程访问共享资源的竞态条件问题。
- 定时器:利用内核定时器实现周期性任务或定时操作。
- 用户空间与内核空间交互:展示用户空间应用程序通过系统调用与内核中设备驱动通信,实现数据读写和控制操作。
安装使用步骤
环境准备
假设用户已下载项目源码文件,且使用Ubuntu系统。进行后续操作前,确保安装必要依赖:
bash
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev crossbuild-essential-armhf
编译内核模块
-
本地编译:若在目标设备上直接编译,使用以下Makefile:
bash obj-m :=Hello.o KERNELDIR = /lib/modules/$(shell uname -r)/build PWD :=$(shell pwd) default : $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean : $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
在源码目录下执行make
命令编译。 -
交叉编译:若需在主机上编译适用于其他架构(如ARM)的内核模块,使用以下Makefile:
bash obj-m := Hello.o KERNELDIR = /lib/modules/5.15.48-Shiva-v7l+/build default : make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNELDIR) M=$(PWD) modules clean : make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KERNELDIR) M=$(PWD) clean
在源码目录下执行make
命令编译。
烧录Raspbian OS到SD卡
- 安装
rpi-imager
:bash sudo apt install rpi-imager snap install rpi-imager
- 运行
rpi-imager
:bash rpi-imager
在rpi-imager
中选择OS为“Raspberry Pi OS (other) => rasperry pi OS Lite 32-bit”,选择存储设备为SD卡,点击“write”并确认。 - 烧录完成后,拔出SD卡再插入,执行以下命令:
bash cd /media/<user-name of your machine>/boot touch ssh touch wpa_supplicant.conf vim wpa_supplicant.conf
在wpa_supplicant.conf
文件中写入以下内容并保存:c country=IN ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev network={ ssid="Your Hotspot name" psk="Your Hotspot Password" key_mgmt=WPA-PSK }
- 拔出SD卡插入树莓派开发板,开发板启动。
加载和卸载内核模块
- 加载模块:使用
insmod
命令加载编译好的内核模块,如:bash sudo insmod hello_world_module.ko
使用lsmod
命令查看已加载模块,使用dmesg
命令查看内核打印信息。 - 卸载模块:使用
rmmod
命令卸载内核模块,如:bash sudo rmmod hello_world_module.ko
- 查看模块信息:使用
modinfo
命令查看模块详细信息,如:bash modinfo hello_world_module.ko
设备文件操作
- 手动创建设备文件:使用
mknod
命令手动创建设备文件,如:bash sudo mknod -m 666 /dev/My_device c 246 0
- 自动创建设备文件:在驱动代码中使用
class_create
和device_create
函数自动创建设备文件。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】