news 2026/4/15 10:28:56

Linux驱动架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux驱动架构

一、设备驱动的位置

┌─────────────────────────────────────────┐ │ 用户空间 (User Space) │ │ 应用程序 → read() / write() / ioctl() │ └─────────────────┬───────────────────────┘ │ 系统调用 (syscall) ┌─────────────────▼───────────────────────┐ │ 内核子系统层 │ │ VFS / Input / DRM / Network / Block │ │ (提供统一抽象接口) │ └─────────────────┬───────────────────────┘ │ 子系统API调用 ┌─────────────────▼───────────────────────┐ │ ┌─────────────────────────────────┐ │ │ │ 设备驱动层 (Device Driver) │ │ │ │ • 实现硬件特定的业务逻辑 │ │ │ │ • 调用控制器API操作硬件 │ │ │ │ • 向子系统注册(如input_register)│ │ │ └─────────────────────────────────┘ │ │ ↓ 调用 │ │ ┌─────────────────────────────────┐ │ │ │ 控制器驱动层 (Controller) │ │ │ │ • SoC内置IP核驱动(I2C/SPI/GPIO)│ │ │ │ • 提供标准API(i2c_transfer等) │ │ │ └─────────────────────────────────┘ │ │ ↓ 寄存器读写 │ │ ┌─────────────────────────────────┐ │ │ │ 硬件寄存器层 │ │ │ │ • 实际物理地址(0x02000000等) │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘

设备驱动的确切位置

  • 上方:对接内核子系统(通过子系统API注册)
  • 下方:调用控制器驱动(通过总线API操作硬件)
  • 角色中间层,承上启下

二、完整Linux系统流程图

┌─────────────────────────────────────────────────────────────────────────┐ │ 用户空间 (User Space) │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────────────┐ │ │ │ Shell │ │ App │ │ GUI │ │ Daemon │ │ 用户态驱动(lib) │ │ │ │ bash/zsh│ │ cat │ │ Qt/GTK │ │ systemd│ │ libusb/libpci │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └────────┬────────┘ │ │ │ │ │ │ │ │ │ └────────────┴────────────┴────────────┴─────────────────┘ │ │ │ │ │ 系统调用接口 (System Call) │ │ int 0x80 / syscall / sysenter / svc │ └────────────────────────────────────┬────────────────────────────────────┘ │ ┌────────────────────────────────────▼────────────────────────────────────┐ │ 内核空间 (Kernel Space) │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 系统调用处理层 (Entry) │ │ │ │ sys_read() / sys_write() / sys_ioctl() / sys_open() ... │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 内核子系统层 (Subsystems) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ VFS │ │ Input │ │ DRM │ │ Network │ │ Block │ │ │ │ │ │(fs/) │ │(drivers/│ │(drivers/│ │ (net/) │ │(block/)│ │ │ │ │ │ │ │input/) │ │gpu/drm/)│ │ │ │ │ │ │ │ │ │文件系统 │ │输入设备 │ │显示设备 │ │网络协议 │ │块设备 │ │ │ │ │ │抽象层 │ │抽象层 │ │抽象层 │ │栈 │ │抽象层 │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 提供统一设备模型 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 设备驱动框架层 (Frameworks) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ Platform│ │ I2C │ │ SPI │ │ USB │ │ PCI │ │ │ │ │ │(片上设备)│ │(两线串行)│ │(四线串行)│ │(通用串行)│ │(高速) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │设备树匹配│ │设备枚举 │ │片选控制 │ │热插拔 │ │配置空间│ │ │ │ │ │资源分配 │ │地址扫描 │ │全双工 │ │带宽管理 │ │DMA能力│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 总线类型与设备发现机制 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 控制器驱动层 (Controller Drivers) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ GPIO │ │ I2C │ │ DMA │ │ Clock │ │ Reset │ │ │ │ │ │Controller│ │Controller│ │ Engine │ │ (CCU) │ │Control │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │引脚复用 │ │时序控制 │ │内存拷贝 │ │时钟树 │ │复位序列│ │ │ │ │ │中断触发 │ │起始停止 │ │中断聚合 │ │PLL配置 │ │模块级 │ │ │ │ │ │(pinctrl)│ │(i2c_algo)│ │(dmaengine)│ │(clk) │ │(reset) │ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ SoC内置IP核驱动(与具体芯片强相关) │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 具体设备驱动层 (Device Drivers) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ LCD │ │ Touch │ │ NVMe │ │ USB │ │ Audio │ │ │ │ │ │ (DRM) │ │ (Input) │ │ (Block) │ │ Net │ │ (ALSA) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │调用DE2.0│ │调用I2C │ │调用PCIe │ │调用USB │ │调用I2S │ │ │ │ │ │配置时序 │ │读取坐标│ │配置NVMe │ │控制网卡 │ │传输音频│ │ │ │ │ │注册DRM │ │注册Input│ │注册Block│ │注册Net │ │注册ALSA│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 承上(子系统)启下(控制器)的中间层 │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────────────▼────────────────────────────┐ │ │ │ 硬件抽象层 (Hardware Abstraction) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ readl │ │ writel │ │ ioremap│ │ dma_map│ │ request│ │ │ │ │ │ readl_relaxed │ │ iounmap│ │ dma_unmap │ │ irq │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │读32位寄存器│ │写32位寄存器│ │映射物理地址│ │DMA内存映射│ │申请中断│ │ │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ └───┬────┘ │ │ │ │ └─────────────┴─────────────┴─────────────┴──────────┘ │ │ │ │ 体系结构相关操作(ARM/x86/RISC-V差异封装) │ │ │ └────────────────────────────────────┬────────────────────────────┘ │ │ │ │ └───────────────────────────────────────┼──────────────────────────────────┘ │ ┌───────────────────────────────────────▼──────────────────────────────────┐ │ 硬件层 (Hardware) │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ SoC芯片 (T113-I) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ CPU │ │ DE2.0 │ │ I2C │ │ GPIO │ │ DMA │ │ │ │ │ │ Core │ │ Display │ │Controller│ │Controller│ │Engine │ │ │ │ │ │ │ │ Engine │ │ │ │ │ │ │ │ │ │ │ │执行指令 │ │图层混合 │ │串行通信 │ │引脚控制 │ │数据搬运│ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └────────┘ │ │ │ │ 寄存器地址:0x02000000 (CCU) / 0x05000000 (DE) 等 │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 片外设备 (External Devices) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌────────┐ │ │ │ │ │ DDR │ │ eMMC │ │ LCD │ │ Touch │ │ PHY │ │ │ │ │ │ Memory │ │ Flash │ │ Panel │ │ (GT911)│ │(Ethernet│ │ │ │ │ │ │ │ │ │ │ │ │ │ PHY) │ │ │ │ │ │数据暂存 │ │持久存储 │ │显示输出 │ │触摸输入 │ │网络接口│ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └────────┘ │ │ │ │ 通过PCB走线连接:DDR总线 / SDIO / I2C / SPI / RGB / MDIO │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘

三、T113-I实例:GT911触摸驱动的完整调用链

用户手指触摸屏幕 │ ▼ 电容变化 ┌─────────────────────────────────────────┐ │ 片外设备:GT911芯片(I2C地址0x14) │ │ PE1引脚电平下降(INT中断) │ └─────────────┬───────────────────────────┘ │ 硬件中断 ┌─────────────▼───────────────────────────┐ │ 硬件层:GIC中断控制器(T113-I片内) │ │ 中断号映射 → CPU收到IRQ │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 内核子系统:IRQ子系统 │ │ handle_IRQ() → 查找irq_desc → 调用handler│ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 控制器驱动:TWI2/I2C控制器驱动 │ │ sunxi_i2c_irq() → 处理I2C中断 │ │ 唤醒等待队列 → i2c_transfer()完成 │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 设备驱动:GT911触摸驱动 │ │ gt911_irq_handler() │ │ ├──► i2c_smbus_read_block_data() 读取坐标│ │ ├──► 坐标变换(swap/invert) │ │ └──► input_report_abs() 上报事件 │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 内核子系统:Input子系统 │ │ input_event() → 插入evdev队列 │ │ 唤醒poll/select → 用户空间可读 │ └─────────────┬───────────────────────────┘ │ ┌─────────────▼───────────────────────────┐ │ 用户空间:Qt/Android应用 │ │ read(/dev/input/event0) → 获取触摸坐标 │ │ 更新UI界面 │ └─────────────────────────────────────────┘

四、关键层次总结

层次核心职责T113-I实例
用户空间业务逻辑Qt应用显示界面
系统调用用户/内核边界read() → sys_read()
内核子系统资源抽象管理Input子系统统一处理所有输入设备
设备驱动框架总线协议管理I2C框架管理总线仲裁、设备枚举
控制器驱动SoC IP核操作sunxi_i2c驱动操作TWI2寄存器
硬件抽象体系结构封装readl/writel实现ARM内存屏障
硬件层物理信号I2C SCL/SDA电平变化、中断信号

五、总结

设备驱动位于"内核子系统"和"控制器驱动"之间,是承上启下的关键层:向上通过子系统API注册(如input_register_device),向下调用控制器API操作硬件(如i2c_transfer)。它不是简单的"建立连接",而是实现业务逻辑、数据转换、电源管理、中断处理的完整软件层。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 20:19:18

专科生收藏!全网顶尖的降AI率平台 —— 千笔·专业降AIGC智能体

在AI技术深度渗透学术写作的当下,越来越多的学生和研究者开始依赖AI工具提升写作效率。然而,随着知网、维普、万方等查重系统不断升级算法,以及Turnitin对AIGC内容的识别愈发严格,AI率超标问题日益凸显,成为论文通过审…

作者头像 李华
网站建设 2026/4/9 20:26:19

ArcGIS应用教学——土地利用现状图制作与面积统计

一、认识数据和软件界面在开始动手制作地图之前,我们首先要搞清楚两件事:我们要处理什么样的数据,以及我们要使用的工具——ArcGIS软件长什么样。PS:例子数据在地球资源数据云平台中免费下载以本网站的2022年吉林省1000米分辨率土地利用遥感监…

作者头像 李华
网站建设 2026/4/11 4:32:01

国际法规更新:2026年测试数据管理必知要点

一、法规风暴:全球合规版图的重构 2026年,数据隐私与AI监管进入强约束时代。中国《网络数据安全管理条例》与修订版《个人信息保护法》(PIPL)构成监管基石,要求测试数据全生命周期合规。欧盟GDPR升级版将算法偏见检测…

作者头像 李华
网站建设 2026/4/12 21:05:04

深度解读CCPA:加州隐私法对测试脚本的影响

随着数据隐私法规的日益严格,《加州消费者隐私法案》(CCPA)已成为全球软件测试领域的焦点。该法案赋予消费者知情权、访问权、删除权和拒绝数据出售权,对测试脚本的编写、执行和验证提出了全新挑战。 一、CCPA核心条款及其对测试脚本的挑战 CCPA于2020年…

作者头像 李华
网站建设 2026/4/12 8:40:26

写作小白救星!抢手爆款的降AI率软件 —— 千笔·专业降AIGC智能体

在AI技术迅速渗透学术写作领域的今天,越来越多的学生开始依赖AI工具辅助完成论文、报告等学术材料。然而,随之而来的“AI率超标”问题也日益凸显——随着知网、维普、万方等查重系统不断升级算法,以及Turnitin对AIGC(人工智能生成…

作者头像 李华
网站建设 2026/4/12 2:36:27

plutofilter 是什么?开源图像滤镜库服务器搭建指南

在做图像处理相关项目时,很多开发者都会遇到一个共通的问题: 想加滤镜很容易,但性能和集成成本却不一定好控制。尤其是在这些场景中:Web 图片处理服务图像预处理与增强视频帧滤镜处理AI 训练前的数据处理如果滤镜库太重、依赖太多…

作者头像 李华