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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索

hello~朋友们!好久不见! 今天给大家带来赛博算命第三期——梅花易数的java实现 赛博算命系列文章: 周易六十四卦 掐指一算——小六壬 更多优质文章:个人主页 JAVA系列:JAVA 大佬们互三哦~互三必回!&#xf…

Spring Web MVC项目的创建及使用

一、什么是Spring Web MVC? Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中,通常被称为Spring MVC。 1.1 MVC的定义 MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构…

Websocket从原理到实战

引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议,它使得客户端和服务器之间能够进行实时、双向的通信,既然是通信协议一定要从发展历史到协议内容到应用场景最后到实战全方位了解 发展历史 WebSocket 最初是为了解决 HTTP 协议在实时…

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台,第一次需要注册一个账号 进去之后需要创建一个API KEY,然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址,点击左边的:接口…

深度解读 Docker Swarm

一、引言 随着业务规模的不断扩大和应用复杂度的增加,容器集群管理的需求应运而生。如何有效地管理和调度大量的容器,确保应用的高可用性、弹性伸缩和资源的合理分配,成为了亟待解决的问题。Docker Swarm 作为 Docker 官方推出的容器集群管理工具,正是在这样的背景下崭露头…

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思…

Ubuntu MKL(Intel Math Kernel Library)

Get Intel oneAPI Math Kernel Library wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/79153e0f-74d7-45af-b8c2-258941adf58a/intel-onemkl-2025.0.0.940_offline.sh sudo sh ./intel-onemkl-2025.0.0.940_offline.sh MKL库的配置和使用-CSDN博客 CMak…

如何在Vscode中接入Deepseek

一、获取Deepseek APIKEY 首先,登录Deepseek官网的开放平台:DeepSeek 选择API开放平台,然后登录Deepseek后台。 点击左侧菜单栏“API keys”,并创建API key。 需要注意的是,生成API key复制保存到本地,丢失…

go-zero学习笔记(三)

利用goctl生成rpc服务 编写proto文件 // 声明 proto 使用的语法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可选) option go_package "./demo";// 如需为 .proto 文件添加注释,请使用 C/C 样式的 // 和 /* ... */…

将Deepseek接入pycharm 进行AI编程

目录 专栏导读1、进入Deepseek开放平台创建 API key 2、调用 API代码 3、成功4、补充说明多轮对话 总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——…

yolov8 opencv模型部署(C++版)

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

Android 常用命令和工具解析之Battery Historian

Batterystats是包含在 Android 框架中的一种工具,用于收集设备上的电池数据。您可以使用adb bugreport命令抓取日志,将收集的电池数据转储到开发机器,并生成可使用 Battery Historian 分析的报告。Battery Historian 会将报告从 Batterystats…

leetcode刷题日记 1

https://leetcode.cn/problems/decode-ways/description/ 题目分析 分析了一下题目,我的第一想法:和之前的上楼梯问题很像 为什么这么说呢,感觉他们的值和他们之前元素都有千丝万缕的联系 就像上楼梯问题 就是我们的dp问题 怎么解释呢&a…

初阶数据结构:树---堆

目录 一、树的概念 二、树的构成 (一)、树的基本组成成分 (二)、树的实现方法 三、树的特殊结构------二叉树 (一)、二叉树的概念 (二)、二叉树的性质 (三&#…

学习笔记:机器学习中的数学原理(一)

1. 集合 集合分为有限集和无限集; 对于有限集,两集合元素数相等即为等势; 对于无限集,两集合元素存在一一映射关系即为等势; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数(也叫…

音频进阶学习十一——离散傅里叶级数DFS

文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn​)的释义 ∑ n 0 N − 1 e…

互联网分布式ID解决方案

业界实现方案 1. 基于UUID 2. 基于DB数据库多种模式(自增主键、segment) 3. 基于Redis 4. 基于ZK、ETCD 5. 基于SnowFlake 6. 美团Leaf(DB-Segment、zkSnowFlake) 7. 百度uid-generator() 基于UUID生成唯一ID UUID生成策略 推荐阅读 DDD领域驱动与微服务架构设计设计模…

BUU28 [GXYCTF2019]BabySQli1

常规万能密码,发现登不上去 过滤掉了or,,当尝试了n种方法以后,最关键的是发现()居然也被过滤了 哈哈,那玩个淡, 再搜wp!! 当输入admin的时候,提示密码错误&#xff0…

数据分析:企业数字化转型的金钥匙

引言:数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下,有研究表明,只有不到30%的企业能够充分利用手中掌握的数据,这是否让人深思?数据已然成为企业最为宝贵的资产之一。然而,企业是否真正准备好从数…

git SourceTree 使用

Source Tree 使用原理 文件的状态 创建仓库和提交 验证 再克隆的时候发发现一个问题,就是有一个 这个验证,起始很简单 就是 gitee 的账号和密码,但是要搞清楚的是账号不是名称,我之前一直再使用名称登录老是出问题 这个很简单的…