struct resource 📅 发布时间:2026/7/9 16:35:17 👁️ 浏览次数: struct resource是 Linux 内核中用于描述硬件设备「物理资源」的核心数据结构核心作用是记录设备的物理地址、中断号、DMA 通道等硬件资源信息同时提供资源申请、释放、冲突检测的机制避免多个驱动抢占同一硬件资源。无论是传统的平台驱动还是基于设备树的驱动最终都会将硬件资源解析为struct resource它是驱动访问硬件资源的「入口凭证」。核心定位struct resource的核心作用有两个资源描述将硬件设备的「物理资源」IO 内存、中断、DMA、IO 端口等封装为统一的数据结构方便内核和驱动管理资源管理内核通过该结构体实现资源的「申请占用、释放、冲突检测」确保同一硬件资源不会被多个驱动同时使用比如两个驱动同时申请同一个中断号。简单来说硬件设备有「物理地址 0x12340000」「中断号 10」这类资源内核 / 设备树将这些资源封装为struct resource数组驱动通过专门的 API 申请这些资源申请成功后才能访问对应的硬件释放时归还资源。它的定义在include/linux/ioport.h头文件中是所有驱动开发字符、块、网络设备的必备知识点。完整定义Linux 5.x 及以上版本struct resource { resource_size_t start; // 资源的起始地址/编号物理地址、中断号等 resource_size_t end; // 资源的结束地址/编号物理地址、中断号等 const char *name; // 资源名称用于标识资源方便调试 unsigned long flags; // 核心资源类型标志区分IO内存、中断、DMA等 struct resource *parent; // 父资源指针用于构建资源层级关系 struct resource *sibling; // 兄弟资源指针用于构建资源链表 struct resource *child; // 子资源指针用于构建资源树 };关键字段深度解析startend资源的「范围标识」这两个字段共同描述资源的有效范围具体含义由flags资源类型决定当资源是「IO 内存」IORESOURCE_MEMstart物理内存的起始地址如设备寄存器的基地址0x12340000end物理内存的结束地址如0x12340fff表示资源长度为0x1000字节资源长度 end - start 1。当资源是「中断」IORESOURCE_IRQ对于单个中断号start end 中断号如start10end10对于中断号范围极少用start是起始中断号end是结束中断号。当资源是「IO 端口」IORESOURCE_IOx86 架构常用startIO 端口的起始编号endIO 端口的结束编号。当资源是「DMA 通道」IORESOURCE_DMAstartend DMA 通道编号。示例描述一个 UART 设备的 IO 内存资源基地址 0x12340000长度 0x1000struct resource uart_mem_res { .start 0x12340000, .end 0x12340000 0xfff, // 结束地址 基地址 长度 - 1 .name uart_mem, .flags IORESOURCE_MEM, };flags核心字段资源「类型标识」flags是无符号长整型用于标识资源的类型、属性、访问权限核心是「资源类型宏」其他属性宏作为补充。① 核心资源类型宏最常用宏定义资源类型适用场景IORESOURCE_MEMIO 内存物理内存映射设备寄存器、片上外设内存ARM/ARM64 最常用IORESOURCE_IRQ中断资源设备的中断号如 SPI、UART、网卡中断IORESOURCE_IOIO 端口x86 架构的传统 IO 端口如 0x3f8 对应串口 1IORESOURCE_DMADMA 通道设备的 DMA 传输通道如磁盘、网卡 DMAIORESOURCE_BUS总线资源设备所属的总线地址范围② 补充属性宏辅助描述资源特性宏定义核心含义IORESOURCE_EXCLUSIVE资源独占使用不允许共享IORESOURCE_SHAREABLE资源可共享如多个设备共享同一中断IORESOURCE_PREFETCH资源支持预取如内存缓存IORESOURCE_READONLY资源只读不可写入如某些状态寄存器示例描述一个可共享的中断资源中断号 10电平触发struct resource uart_irq_res { .start 10, .end 10, .name uart_irq, .flags IORESOURCE_IRQ | IORESOURCE_SHAREABLE, // 中断资源 可共享 };name资源名称用于「调试与标识」可选字段用于给资源命名方便调试时识别资源类型内核日志、/sys文件系统中会显示该名称帮助排查资源冲突问题示例uart_mem、eth0_irq、sdma_channel_0。parent/sibling/child资源「层级管理」用于构建资源的「树状 / 链表结构」方便内核管理一组相关资源如一个设备的多个 IO 内存、多个中断驱动开发者通常无需手动操作这些字段由内核自动维护示例一个网卡设备有「IO 内存」「中断」「DMA 通道」三个资源内核会将它们组织为兄弟链表挂在设备的资源根节点下。struct resource支持的核心资源类型日常驱动开发中最常用的是IORESOURCE_MEMIO 内存和IORESOURCE_IRQ中断两者覆盖了 90% 以上的嵌入式驱动场景下面展开详解。IORESOURCE_MEMIO 内存核心场景ARM/ARM64 架构下的片上外设UART、GPIO、SPI、PCIe 设备网卡、NVMe的寄存器访问都是通过 IO 内存实现的。驱动中使用流程获取资源通过platform_get_resource()从设备中获取 IO 内存资源申请资源通过devm_request_mem_region()申请占用该内存区域避免冲突内存映射通过devm_ioremap_resource()将物理地址映射为内核虚拟地址内核无法直接访问物理地址访问硬件通过readl()/writel()读写映射后的虚拟地址操作设备寄存器释放资源驱动卸载时devm_系列函数会自动释放映射和资源无需手动操作。IORESOURCE_IRQ中断核心场景设备的异步事件通知如网卡收包、UART 数据到达、磁盘 IO 完成都需要通过中断实现。驱动中使用流程获取资源通过platform_get_irq()从设备中获取中断号封装自platform_get_resource()申请中断通过devm_request_irq()申请中断注册中断处理函数处理中断中断触发时执行注册的中断处理函数顶半部释放中断驱动卸载时devm_系列函数自动释放中断无需手动操作。设备树与struct resource的关联在基于设备树的驱动开发中我们并不会手动定义struct resource而是由内核自动将设备树节点中的硬件资源解析为struct resource数组驱动只需通过 API 获取即可这也是设备树的核心优势之一。1. 设备树节点 →struct resource映射关系设备树中的核心资源属性会被内核自动解析为对应的struct resource设备树属性对应struct resource类型映射逻辑regIORESOURCE_MEM/IORESOURCE_IOreg中的addr size解析为startaddrendaddrsize-1interruptsIORESOURCE_IRQinterrupts中的中断号解析为startendirqdmaIORESOURCE_DMAdma中的通道号解析为startenddma_channel2. 示例设备树节点与内核解析结果1设备树节点定义uart1: serial12340000 { compatible fsl,imx6ul-uart; reg 0x12340000 0x1000; // 物理地址 0x12340000长度 0x1000 interrupts GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH; // 中断号 10 };2内核自动解析后的struct resource数组内核会为该设备创建一个resource数组包含两个元素// 第 0 个资源IO 内存 struct resource res[0] { .start 0x12340000, .end 0x12340fff, .name serial12340000, .flags IORESOURCE_MEM, }; // 第 1 个资源中断 struct resource res[1] { .start 10, .end 10, .name serial12340000, .flags IORESOURCE_IRQ, };3驱动中获取解析后的资源驱动中通过platform_get_resource()/platform_get_irq()即可获取上述资源无需手动定义实现了硬件信息与驱动代码的解耦。关键注意事项与最佳实践优先使用devm_系列 API申请资源 / 映射内存时优先使用devm_request_mem_region()、devm_ioremap_resource()、devm_request_irq()等devm_前缀函数这些函数会自动管理资源生命周期驱动卸载时无需手动释放避免资源泄漏。资源申请失败必须处理platform_get_resource()、devm_ioremap_resource()等函数返回NULL或错误码时必须打印错误日志并返回不能继续执行后续硬件操作否则会导致系统崩溃。内核无法直接访问物理地址struct resource中记录的start/end是物理地址内核态代码无法直接访问必须通过ioremap()系列函数映射为虚拟地址后才能用readl()/writel()读写。中断资源的startend单个中断号的资源start和end必须相等内核才会识别为有效中断资源。资源冲突排查如果驱动申请资源失败可通过/proc/iomem查看 IO 内存占用和/proc/interrupts查看中断占用排查是否有其他驱动抢占了该资源。关键要点struct resource是 Linux 内核描述硬件物理资源的统一数据结构核心字段是start/end资源范围和flags资源类型。最常用的资源类型是IORESOURCE_MEMIO 内存和IORESOURCE_IRQ中断覆盖绝大多数嵌入式驱动场景。基于设备树的驱动中内核会自动将设备树节点的reg/interrupts等属性解析为struct resource驱动只需通过标准 API 获取即可。最佳实践是优先使用devm_系列函数管理资源避免资源泄漏同时必须处理资源申请失败的场景。
Qt图像处理利器:QPixmap类完全解析与实战指南 一、QPixmap类概述 QPixmap是Qt框架中用于处理图像的核心类之一,专门为在屏幕上显示图像而优化。与QImage不同,QPixmap针对显示性能进行了特殊优化,更适合在GUI线程中直接渲染。 1. 主要特点 显示优化:底层使用平台相关的图形系统 线程安全:可在GUI线程外创建,但只能在… 2026/7/7 8:42:45
揭秘物流仓储自动化:从PLC到触摸屏的奇妙之旅 堆垛机西门子PLC程序输送线程序触摸屏程序。物流仓储。 涵盖通信,算法,运动控制,屏幕程序,可电脑仿真测试。 实际项目完整程序。 西门子S7-1200+G120劳易测激光测距 博途V15.1编程 采用SCL高级编程语言。 无加密。物流… 2026/7/7 4:07:08
整车性能目标书,性能目标模板。 QR汽车性能目标书模板,包含整车及目标及目标分解。 内容详实 整车性能目标书,性能目标模板。 QR汽车性能目标书模板,包含整车及目标及目标分解。 内容详实,可以作为性能集成开发参考资料聊聊汽车性能开发那点事儿做汽车研发的工程师都懂,性能目标书就是项目启动时的"宪法"。QR汽车… 2026/7/8 14:40:08
SciPy 1.13 实战:5大统计分布(泊松/卡方/正态/t/F)Python 代码实现与可视化 SciPy 1.13 实战:5大统计分布Python代码实现与可视化指南 统计分布是数据分析与机器学习的基石,掌握它们的特性和应用场景能帮助我们更好地理解数据背后的规律。本文将带你用SciPy 1.13版本实现五种核心统计分布——泊松分布、卡方分布、正态分布、t分布… 2026/7/9 16:34:43
对象存储选型的工程决策模型:从MinIO纠删码的数学原理到S3 API兼容性的迁移陷阱 对象存储选型的工程决策模型:从MinIO纠删码的数学原理到S3 API兼容性的迁移陷阱 一、对象存储不是"更大号的文件系统":三种范式下的架构取舍 很多人把对象存储理解为"能存很多文件的系统",这个简化在很多场景下能用&… 2026/7/9 16:32:42
Leap Motion手势追踪与Project North Star AR眼镜集成实战指南 1. 项目概述:当AR眼镜遇见你的双手 几年前,当我第一次戴上Project North Star原型机,看到虚拟的立方体悬浮在真实桌面上时,那种震撼感至今难忘。但更让我着迷的,是当我伸出手,无需任何控制器,仅… 2026/7/9 16:32:42
汽车DV/PV试验实战解析:3个关键阶段差异与5步执行流程 汽车DV/PV试验实战解析:3个关键阶段差异与5步执行流程在汽车零部件开发领域,设计验证(DV)与过程验证(PV)试验是确保产品质量的两大支柱。不同于传统教科书式的概念罗列,本文将聚焦工程师日常工作… 2026/7/9 16:28:41
ROS是什么?核心逻辑,ROS2 已经不是做科研的了吗? 一、ROS 到底是什么? ROS 全称机器人操作系统(Robot Operating System),但它并不是 Windows、Linux 这种管理硬件资源的底层操作系统,而是一套面向机器人开发的开源中间件 工具链 算法生态集合,是全球机… 2026/7/9 16:26:31
GitHub原生绘图三技能:Mermaid、Excalidraw、PlantUML工程化实践 1. 这不是又一个“画图工具推荐”,而是 GitHub 原生生态里真正能嵌入工作流的 3 个绘图 Skill 你有没有过这种时刻:在写一份技术方案时,刚敲完一段接口设计说明,突然卡住——“这个调用链到底该不该加重试?上下游依赖关… 2026/7/9 16:26:31
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比 GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M… 2026/7/9 0:03:06
【大数据毕业设计】基于多源旅游数据的景区热度分析与推荐系统的设计与实现 基于 Django 的旅游偏好挖掘与景区推荐系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 0:05:09
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08