项目计划书目录,长春网站seo外包,网上怎么注册公司免费的,ps网站如何做烫金的文字struct resource 是 Linux 内核中用于描述硬件设备「物理资源」的核心数据结构#xff0c;核心作用是记录设备的物理地址、中断号、DMA 通道等硬件资源信息#xff0c;同时提供资源申请、释放、冲突检测的机制#xff0c;避免多个驱动抢占同一硬件资源。无论是传统的平台驱…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_系列函数管理资源避免资源泄漏同时必须处理资源申请失败的场景。