Linux 设备驱动分类(快速理解驱动架构)
在 Linux 设备驱动开发中,最基础的概念就是 设备驱动的分类。
Linux 设备驱动主要分为 字符设备、块设备和网络设备,它们分别对应不同类型的硬件资源。
理解这些分类,不仅能帮助你更快掌握 Linux 设备驱动开发,还能帮助你更好地调试和优化驱动程序。
📌 本文主要内容:
- Linux 设备驱动的 3 大分类(字符设备、块设备、网络设备)
- /dev 目录下的设备文件解析
- 设备驱动与文件系统的关系
- 实战:使用 ls /dev 和 lsmod 查看设备驱动信息
1. Linux 设备驱动的 3 大分类
在 Linux 内核中,所有硬件设备都由相应的 驱动程序 进行管理。按照设备的 数据传输方式,可以分为以下三类:
设备类型 | 描述 | 常见设备 | 系统调用 |
---|---|---|---|
字符设备(Character Device | 按字节流方式访问 | 串口(UART)、I2C、SPI、GPIO | open/read/write/ioctl |
块设备(Block Device) | 按块(Block)方式访问,具有缓冲 | 硬盘(HDD、SSD)、SD 卡、U 盘 | open/read/write/mmap/fs |
网络设备(Network Device) | 通过协议栈收发数据包 | 以太网、WiFi、蓝牙 | socket/send/recv/ioctl |
接下来,我们来详细看看这三类设备的特点。
## 1.1 字符设备驱动
字符设备(Character Device)是 按字节流方式 进行数据传输的设备。它们不经过缓存,数据的读取和写入是 实时的。
📌 常见的字符设备:
- 串口(UART)
- I2C / SPI 设备
- GPIO
- 蜂鸣器、LED
📌 字符设备的特点: ✅ 读写数据时 不经过缓存,直接交给硬件
✅ 适用于 实时性要求高 的外设(如串口通信)
✅ 设备文件通常位于 /dev 目录,例如:
ls /dev/ttyS*
ls /dev/i2c*
ls /dev/spidev*
字符设备通常需要实现以下内核 API:
static struct file_operations fops = {.open = my_driver_open,.read = my_driver_read,.write = my_driver_write,.release = my_driver_release,
};
当应用程序 open(“/dev/my_device”) 时,Linux 内核就会调用 my_driver_open()。
1.2 块设备驱动
块设备(Block Device)是 按块(Block)方式 进行数据传输的设备。它们会经过 缓存机制,数据读写通常是 成批量 进行的。
📌 常见的块设备:
- SD 卡
- U 盘
- eMMC / NVMe / SSD
- 机械硬盘(HDD)
📌 块设备的特点: ✅ 读写数据时 经过缓冲区,可以提升读写性能
✅ 适用于 大容量存储设备(如 SD 卡、SSD)
✅ 设备文件通常位于 /dev 目录,例如:
ls /dev/sd*
ls /dev/mmcblk*
ls /dev/nvme*
块设备通常需要实现 块 I/O 操作(bio):
static struct block_device_operations bdev_fops = {.open = my_bdev_open,.release = my_bdev_release,.ioctl = my_bdev_ioctl,
};
1.3 网络设备驱动
网络设备(Network Device)主要用于 数据包(Packet)通信,通常通过 协议栈 进行传输,例如 TCP/IP、UDP。
📌 常见的网络设备:
- 以太网(Ethernet)
- WiFi
- 蓝牙(Bluetooth)
- 4G / 5G 模块
📌 网络设备的特点: ✅ 不使用 /dev/ 设备文件,而是使用 socket 编程 访问
✅ 主要接口是 send() / recv()
✅ 设备名称通常是 eth0、wlan0、lo:
ifconfig -a
ip link show
在驱动代码中,通常会注册 net_device 结构:
static struct net_device_ops my_netdev_ops = {.ndo_open = my_net_open,.ndo_stop = my_net_stop,.ndo_start_xmit = my_net_xmit,
};
网络设备的 read() / write() 不同于字符设备,而是基于 协议栈 处理数据包。
2. /dev 目录下的设备文件解析
Linux 设备驱动的 最终表现形式 是 /dev 目录下的 设备文件。
ls -l /dev/
你会看到:
crw-rw---- 1 root tty 4, 64 Aug 31 12:00 /dev/ttyS0 # 字符设备
brw-rw---- 1 root disk 8, 0 Aug 31 12:00 /dev/sda # 块设备
- c(Character) 代表字符设备
- b(Block) 代表块设备
可以用 lsmod 查看当前已加载的驱动:
lsmod
3. 设备驱动与文件系统的关系
设备驱动程序的主要作用是 让应用层能访问底层硬件。它通常会和 文件系统 结合:
- 字符设备 → /dev/ttyS0
- 块设备 → /dev/sda1(挂载 /mnt)
- 网络设备** → eth0(挂载到协议栈)
在 Linux 内核中,设备驱动和文件系统的关系如下:
应用程序 --> 文件系统(VFS)--> 设备驱动 --> 硬件
你可以使用 mount 挂载块设备:
mount /dev/sda1 /mnt
4. 实战:使用 ls /dev 和 lsmod 查看设备驱动信息
4.1 查看字符设备
ls -l /dev/ttyS*
ls -l /dev/i2c*
ls -l /dev/spidev*
4.2 查看块设备
ls -l /dev/sd*
ls -l /dev/mmcblk*
4.3 查看网络设备
ifconfig -a
ip link show
4.4 查看已加载的驱动模块
lsmod
如果想手动加载驱动:
modprobe my_driver
卸载驱动:
rmmod my_driver
总结
🔹 Linux 设备驱动分为 字符设备、块设备和网络设备
🔹 /dev 目录下存放字符设备和块设备,网络设备不在 /dev 目录
🔹 可以使用 ls /dev、lsmod、ifconfig 查看设备信息
📢 下一篇文章:《Linux 设备树(Device Tree)基础》
💡 如果觉得有帮助,记得 点赞、收藏、关注,让我们一起深入学习 Linux 设备驱动开发!🚀🚀🚀