news 2026/4/18 10:58:01

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/18 8:17:00

深度对比:Java、Go、Python 实现企微外部群推送,哪个效率更高?

​​QiWe开放平台 个人名片 API驱动企微自动化,让开发更高效 核心能力:API 驱动企微自动化,提升开发效率 官方站点:https://www.qiweapi.com 对接通道:进入官方站点联系客服 团队定位:企微生态深度服务&am…

作者头像 李华
网站建设 2026/4/17 18:32:56

软工毕设创新的项目选题怎么做

0 选题推荐 - 人工智能篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际…

作者头像 李华
网站建设 2026/4/15 17:30:54

总结了1000道2026年Java架构师岗面试题

半年前还在迷茫该学什么,怎样才能走出现在的困境,半年后已经成功上岸阿里,感谢在这期间帮助我的每一个人。面试中总结了1000道经典的Java面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类&#xff0…

作者头像 李华