【Tips】关于PCI和PCIe的配置空间差异和io/memory io读写

article/2025/8/25 12:55:12

最近在看同事2023年讲的PCI基础课,感觉确实是豁然开朗了,赞美同事。

PCIe实际上是PCI的扩展(extended),PCIe设备相当于是迭代升级产品。

而PCIe的配置空间基于PCI原有的0xFF(256字节)配置空间扩展到了OxFFF(4K),也就是普通PCI设备拥有256字节配置空间,PCIe设备有4K配置空间(0到FF是PCI配置空间,100到1FF是作为PCIe扩展配置空间)。

如图所示,而100到1FFF那段扩展空间多用于capabilities(注意,PCIe区域的capabilities结构和PCI区域的有区别),PCIe设备的PCI部分配置空间最后的capability会指到PCIe部分(100-1FF)去。下图是PCI的capability,如果只是PCI设备的话,到寻址为00H的部分它就结束capabilities了。

下图右侧是PCIe部分的capability,可以看到它的布局和PCI部分的不一样,比如ID占16bit(PCI里是8bit),因为它的寻址最多会到FFF去。

然后要讲的就是关于它们的io/memory io读写。

PCI设备的话,用IO方式读写没问题,但是对于PCIe设备的扩展空间部分,Register就明显不足了(我们以前写register写的是XX H,因为PCI设备的配置空间最多到FF H)。这个时候我们就必须选择Memory IO的方式来读写(当然Memory IO的方式也可以读PCI设备,可以看作是一种兼容)。注意:如果还要用IO方式来读写PCIe设备,只能读前面的0至FF区域,写入CF8的是以80开头而不是MMIO方式的F开头。

MMIO读取(用C语言的函数)具体怎么写:

这里最前面4位(31:28)的1111是规定,接8位Bus,接5位Device,接3位Function,后面剩下的12位是寄存器(000到最大的FFF皆为12位)。

这12位可以细分为11:8这4bit的PCI扩展(extended)寄存器,和7:0的PCI寄存器(图里1:0被单独写出来的原因可以看我另外一篇博客:关于PCI的IO Port读取为什么写入0CF8的32位里最后2bit规定是0-CSDN博客)。

和IO读写写入的值(注意这里IO输入的80开头的只是一个格式,并不是实际地址,MMIO输入的F开头的才是实际内存地址)的区别大概就是前四位由1000变为1111,bus device function集体左移4位,function之后的12位写register(IO里function后面只剩8位)。


http://www.hkcw.cn/article/LrhjUZhbOL.shtml

相关文章

华为OD机试真题——阿里巴巴找黄金宝箱(III)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

拓扑排序算法剖析与py/cpp/Java语言实现

拓扑排序算法深度剖析与py/cpp/Java语言实现 一、拓扑排序算法的基本概念1.1 有向无环图(DAG)1.2 拓扑排序的定义1.3 拓扑排序的性质 二、拓扑排序算法的原理与流程2.1 核心原理2.2 算法流程 三、拓扑排序算法的代码实现3.1 Python实现3.2 C实现3.3 Java…

C#学习:基于LLM的简历评估程序

前言 在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。 准备不同的简历: 查看效果: 不足之处是现实的简历应该是pdf格式的,后面可以…

华为OD机试真题——阿里巴巴找黄金宝箱(II)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现

最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现 一、网络流问题与相关概念1.1 网络流问题定义1.2 关键概念 二、Ford-Fulkerson算法原理2.1 核心思想2.2 算法步骤 三、Ford-Fulkerson算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、Ford-Fulkerson算法的时间…

摄像头模块的镜头类型

一、‌按光学功能分类‌ ‌球面镜(Spherical Lens)‌ ‌特点‌:表面为球面曲率,工艺简单且成本低,但存在球面像差和色差,边缘画质易模糊。 ‌应用‌:低端监控设备、玩具相机等对画质要求低的…

汽车EPS系统的核心:驱动芯片的精准控制原理

随着科技的飞速发展,电机及其驱动技术在现代工业、汽车电子、家用电器等领域扮演着越来越重要的角色。有刷马达因其结构简单、成本低廉、维护方便等优点,在市场上占据了一定的份额。然而,为了充分发挥有刷马达的性能,一款高效能、…

51c视觉~3D~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13954440 #SceneTracker 在4D时空中追踪万物!国防科大提出首个长时场景流估计方法 本篇分享 TPAMI 2025 论文​​SceneTracker: Long-term Scene Flow Estimation Network​​,国防科大提出首…

【25-cv-05855】Keith律所代理Paula Alejandra Navarro 版权图

Paula Alejandra Navarro 版权图 案件号:25-cv-05855 立案时间:2025年5月27日 原告:Paula Alejandra Navarro 代理律所:Keith 原告介绍 原告是来自巴拿马的自由职业艺术家,擅长将精灵、中世纪服饰等经典奇幻元素…

vue自定义穿梭框(内容体+多选框)

最近需要做一个资源分配的一个功能,然后用到了穿梭框,但是需要更多的功能控制。具体业务场景如下:需要同时可以分配查看和下载的权限。实现效果如下: 组件用的是: Ant Design Vue 的穿梭框 操作方式:在左…

各国竞争的下一代液晶技术:中国铁电液晶取得重大突破突破

一、全球下一代液晶技术发展格局 (一)韩国:OLED 技术持续领先,布局量子点与柔性显示 韩国作为显示产业强国,三星、LG 等企业在 OLED 领域占据全球主导地位。三星的 AMOLED 技术广泛应用于高端智能手机,其柔…

张亚中提打败赖清德唯一策略 促两岸和平共识

随着国民党主席朱立伦任期即将届满,台湾孙文学校总校长张亚中已于21日宣布参选党主席。张亚中表示,国民党需要一个政策与路线的大辩论,包括两岸关系的核心问题和定位。他认为,若无此策略,国民党难以凭借资历、战力或团结击败现任台湾地区领导人赖清德重返执政。张亚中在接…

《深度关系-从建立关系到彼此信任》

陈海贤老师推荐的书,花了几个小时,感觉现在的人与人之间特别缺乏这种深度的关系,但是与一个人建立深度的关系并没有那么简单,反正至今为止,自己好像没有与任何一个人建立了这种深度的关系,那种双方高度同频…

LLaMaFactory - 支持的模型和模板 常用命令

一、 环境准备 激活LLaMaFactory环境,进入LLaMaFactory目录 cd LLaMA-Factoryconda activate llamafactory 下载模型 #模型下载 from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-0.5B-Instruct) 二、启动一个 Qwen3-0.6B…

数据结构——优先级队列(PriorityQueue)

1.优先级队列 优先级队列可以看作队列的另一个版本,队列的返回元素是由是由插入顺序决定的,先进先出嘛,但是有时我们可能想要返回优先级较高的元素,比如最大值?这种场景下就由优先级队列登场。 优先级队列底层是由堆实…

学习如何设计大规模系统,为系统设计面试做准备!

前言 在当今快速发展的技术时代,系统设计能力已成为衡量一名软件工程师专业素养的重要标尺。随着云计算、大数据、人工智能等领域的兴起,构建高性能、可扩展且稳定的系统已成为企业成功的关键。然而,对于许多工程师而言,如何有效…

负载电容匹配:晶振电路设计中被忽视的隐形杀手

在电子电路的复杂世界里,晶振电路作为频率控制的核心部件,其稳定性和准确性对整个系统的性能起着举足轻重的作用。晶振就如同电子设备的“心脏起搏器”,精准地控制着电路的运行节奏。然而,在众多影响晶振电路性能的因素中&#xf…

Python Day36 学习

对列表、字典、元组、集合进行总结 浙大疏锦行 摘自讲义 机器学习管道Pipeline Q1. 什么是机器学习管道Pipeline? 摘自讲义 Q. 关于“转换器”? 摘自讲义 # 导入StandardScaler转换器 from sklearn.preprocessing import StandardScaler# 初始化转换…

003 flutter初始文件讲解(2)

1.书接上回 首先,我们先来看看昨天最后的代码及展示效果: import "package:flutter/material.dart";void main(){runApp(MaterialApp(home:Scaffold(appBar:AppBar(title:Text("The World")), body:Center(child:Text("Hello…

深入理解C#中的LINQ:数据查询的终极利器

在现代软件开发中,数据处理和查询是几乎所有应用程序的核心需求。无论是从数据库检索数据、过滤内存中的集合,还是解析XML文档,开发者都需要高效、灵活的方式来操作数据。C# 提供的 LINQ(Language Integrated Query,语…