没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux PCI-e架构深度解析:驱动与资源管理
本文档深入探讨了Linux下的PCIE架构以及其设备驱动的编写和使用方法。Linux系统对于I/O资源管理采用了一种倒置的树形结构,这种设计使得资源的组织和管理更加清晰。具体来说,Linux使用`struct resource`数据结构来描述各类I/O资源,包括I/O端口、外设内存、DMA和IRQ等,这些资源的范围由`start`和`end`字段定义,形成一个闭区间。例如,IDE硬盘接口的I/O端口地址就被组织在这样的树结构中,主盘和从盘的子范围被作为父节点的子资源进行管理。 每个资源节点都有`name`字段用于存储资源名称,`flags`字段用于描述资源的特性,如共享或只读等。树状结构的优势在于方便驱动程序根据设备特有的需求划分和管理子范围,比如IDE设备驱动程序通过添加子资源来区分主盘和从盘的不同I/O区域。树的根节点,如ioport_resource,覆盖了整个I/O地址空间,而每个具体的PCI设备则通过`struct pci_dev`数据结构进行描述,这个结构包含了设备的全局信息,如设备列表的关联(通过`global_list`字段)和特定的PCI功能描述(`struct pci_dev`中的其他成员)。 `struct pci_dev`是PCI设备的核心数据结构,它不仅代表了PCI设备的硬件配置,还包含了设备的驱动程序信息和状态。每个PCI逻辑设备在系统中都是唯一的,通过这个数据结构,驱动程序可以访问和操作PCI设备的配置空间,执行数据传输等任务。因此,理解Linux下的PCIE架构和驱动编程,不仅需要掌握资源管理的原理,还要熟悉PCI设备驱动的编写规范和流程,这对于开发高效、兼容的Linux设备驱动至关重要。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/6285023/bg9.jpg)
unsigned
(3)readb 和 writeb:
在设备的物理地址被映射到虚拟地址之后,尽管可以直接通过指针访问这些地址,但是工
程师宜使用 Linux 内核的如下一组函数来完成设备内存映射的虚拟地址的读写,这些函数
包括:
· 读 I/O 内存
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
与上述函数对应的较早版本的函数为(这些函数在 Linux 2.6 中仍然被支持):
unsigned readb(address);
unsigned readw(address);
unsigned readl(address);
· 写 I/O 内存
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
与上述函数对应的较早版本的函数为(这些函数在 Linux 2.6 中仍然被支持):
void writeb(unsigned value, address);
void writew(unsigned value, address);
void writel(unsigned value, address);
(4)把 I/O 端口映射到“内存空间”:
void *ioport_map(unsigned long port, unsigned int count);
通过这个函数,可以把 port 开始的 count 个连续的 I/O 端口重映射为一段“内存空间”。然后
就可以在其返回的地址上像访问 I/O 内存一样访问这些 I/O 端口。当不再需要这种映射时,
需要调用下面的函数来撤消:
void ioport_unmap(void *addr);
实际上,分析 ioport_map()的源代码可发现,所谓的映射到内存空间行为实际上是给开发人
员制造的一个“假象”,并没有映射到内核虚拟地址,仅仅是为了让工程师可使用统一的 I/O
内存访问接口访问 I/O 端口。
----------------------------------------------------------------------------------
Linux 对 I/O 端口资源的管理
几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“ I/O 端口”,
通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被
连续地编址。CPU 对外设 IO 端口物理地址的编址方式有两种:一种是 I/O 映射方式(I/O-
mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于 CPU 的体
系结构。
有些体系结构的 CPU(如,PowerPC、m68k 等)通常只实现一个物理地址空间(RAM)。在
这种情况下,外设 I/O 端口的物理地址就被映射到 CPU 的单一物理地址空间中,而成为内
![](https://csdnimg.cn/release/download_crawler_static/6285023/bga.jpg)
存的一部分。此时,CPU 可以象访问一个内存单元那样访问外设 I/O 端口,而不需要设立
专门的外设 I/O 指令。这就是所谓的“内存映射方式”(Memory-mapped)。
而另外一些体系结构的 CPU(典型地如 X86)则为外设专门实现了一个单独地地址空间,
称为“I/O 地址空间”或者“I/O 端口空间”。这是一个与 CPU 地 RAM 物理地址空间不同的地址
空间,所有外设的 I/O 端口均在这一空间中进行编址。CPU 通过设立专门的 I/O 指令(如
X86 的 IN 和 OUT 指令)来访问这一空间中的地址单元(也即 I/O 端口)。这就是所谓的“I/O 映
射方式”(I/O-mapped)。与 RAM 物理地址空间相比,I/O 地址空间通常都比较小,如 x86
CPU 的 I/O 空间就只有 64KB(0-0xffff)。这是“I/O 映射方式”的一个主要缺点。
Linux 将基于 I/O 映射方式的或内存映射方式的 I/O 端口通称为“I/O 区域”(I/O region)。在讨
论对 I/O 区域的管理之前,我们首先来分析一下 Linux 是如何实现“I/O 资源”这一抽象概念
的。
Linux 对 I/O 资源的描述
--------------------------------------
Linux 设计了一个通用的数据结构 resource 来描述各种 I/O 资源(如:I/O 端口、外设内存、
DMA 和 IRQ 等)。该结构定义在 include/linux/ioport.h 头文件中:
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
Linux 对 I/O 资源的管理
--------------------------------------
Linux 是以一种倒置的树形结构来管理每一类 I/O 资源(如:I/O 端口、外设内存、DMA
和 IRQ)的。每一类 I/O 资源都对应有一颗倒置的资源树,树中的每一个节点都是一个
resource 结构,而树的根结点 root 则描述了该类资源的整个资源空间。
基于上述这个思想,Linux 在 kernel/resource.c 文件中实现了对资源的申请、释放及查找
等操作。
资源的申请: request_resource()
资源的释放: release_resource()
寻找可用资源: --find_resource()
分配资源: allocate_resource()
管理 I/O Region 资源
--------------------------------------
Linux 将基于 I/O 映射方式的 I/O 端口和基于内存映射方式的 I/O 端口资源统称为“I/O 区
域”(I/O Region)。I/O Region 仍然是一种 I/O 资源,因此它仍然可以用 resource 结构类型来
描述。下面我们就来看看 Linux 是如何管理 I/O Region 的。
剩余49页未读,继续阅读
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/2f7484966cbf48c5a507dfccefc4e188_xiaoxia711.jpg!1)
小霞xiaoxia
- 粉丝: 22
- 资源: 143
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)