Linux 设备驱动分类(快速理解驱动架构)

news/2025/2/8 1:27:15/

Linux 设备驱动分类(快速理解驱动架构)

在 Linux 设备驱动开发中,最基础的概念就是 设备驱动的分类
Linux 设备驱动主要分为 字符设备块设备网络设备,它们分别对应不同类型的硬件资源。
理解这些分类,不仅能帮助你更快掌握 Linux 设备驱动开发,还能帮助你更好地调试和优化驱动程序。

📌 本文主要内容:

  • Linux 设备驱动的 3 大分类(字符设备块设备网络设备
  • /dev 目录下的设备文件解析
  • 设备驱动与文件系统的关系
  • 实战:使用 ls /dev 和 lsmod 查看设备驱动信息

1. Linux 设备驱动的 3 大分类

在 Linux 内核中,所有硬件设备都由相应的 驱动程序 进行管理。按照设备的 数据传输方式,可以分为以下三类:

设备类型描述常见设备系统调用
字符设备(Character Device按字节流方式访问串口(UART)、I2C、SPI、GPIOopen/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     # 块设备

可以用 lsmod 查看当前已加载的驱动:

lsmod

3. 设备驱动与文件系统的关系

设备驱动程序的主要作用是 让应用层能访问底层硬件。它通常会和 文件系统 结合:

在 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 设备驱动开发!🚀🚀🚀


http://www.ppmy.cn/news/1570198.html

相关文章

OpenAI新商标申请曝光:AI硬件、机器人、量子计算全线布局?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Rust 的内存管理机制

Rust 的内存管理机制是其最核心的创新之一,它通过 所有权系统(Ownership)、借用检查器(Borrow Checker) 和 生命周期(Lifetimes) 在编译期静态保障内存安全,无需垃圾回收(GC)且避免手动管理内存的错误。下面通过代码示例详细解析其机制和安全性原理: 1. 所有权系统(…

websocket自动重连封装

websocket自动重连封装 前端代码封装 import { ref, onUnmounted } from vue;interface WebSocketOptions {url: string;protocols?: string | string[];reconnectTimeout?: number; }class WebSocketService {private ws: WebSocket | null null;private callbacks: { [k…

从零开始部署Dify:后端与前端服务完整指南

从零开始部署Dify:后端与前端服务完整指南 一、环境准备1. 系统要求2. 项目结构 二、后端服务部署1. 中间件启动(Docker Compose)2. 后端环境配置3. 依赖安装与数据库迁移4. 服务启动 三、前端界面搭建1. 环境配置2. 服务启动 四、常见问题排…

因果推断与机器学习—可解释性、公平性和因果机器学习

随着人工智能技术的飞速发展,如人脸识别、自动驾驶、智能音箱和手术机器人等在社会各领域广泛应用,人工智能已成为科技革命和产业变革的核心驱动力。然而,在带来便利的同时,也引发了一系列问题: 数据统计:2016 年,基于美国食品和药物管理局(U.S. Food and Drug Adminis…

vue3 的 onScopeDispose 是什么作用

onScopeDispose 是 Vue 3 中用于管理响应式副作用的一个重要 API,主要用于在当前活跃的 effect 作用域上注册一个处理回调函数。当这个作用域停止时,所注册的回调函数会被调用。这种机制使得开发者能够有效地清理和管理资源,尤其是在组合式函…

windows系统中docker根据Dockerfile文件部署jar包到容器中

第一步:在windows下安装docker容器(忽略,自行百度一下)。 第二步:在IDEA中打包jar包 第三步:准备Dockerfile文件 FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17WORKDIR /appCOPY pla…

【教学】推送docker仓库

引言 Docker Hub 这个最常见的公共 Docker 仓库为例,本文将介绍如何把本地 Docker 镜像推送到公共 Docker 仓库 1. 注册 Docker Hub 账号 如果你还没有 Docker Hub 账号,需要先在 Docker Hub 官网 进行注册。注册完成后,记住你的用户名和密…