当前位置: 首页 > news >正文

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

最近在看同事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位)。

相关文章:

  • One Year~
  • 如何用Go创建一个 deployment 到容器拉起来的全流程
  • Python 迭代器:从基础到高级
  • 字体查看器
  • meilisearch docker 简单安装
  • 【前端】Hexo一键生成目录插件推荐_放入Hexo博客
  • Linux `cp` 命令深度解析与高阶应用指南
  • 今日分享:怎么综合分析5星股票?
  • 解释PV和PVC的关系,开发有状态应用时如何挂载持久化存储?
  • 软考-系统架构设计师-第八章 数据库设计基础知识
  • MySQL高可用革命:Orchestrator实现零干预的故障转移与智能拓扑管理
  • 鸿蒙NEXT应用加固工具哪家更好?国内主流的6款对比
  • openEuler安装MySql8(tar包模式)
  • 连接远程桌面计算机提示:“这可能是由于CredSSP加密数据库修正” 问题解决方案
  • 英语学习5.29
  • 志高机械:走出国门 积极开拓海外市场 新增增长引擎
  • 管程机制 基本讲解
  • 使用Redisson实现分布式锁发现的【订阅超时】Subscribe timeout: (7500ms)
  • Android 倒计时总结
  • SmolDocling-256M:极小参数量的视觉语言模型|端到端文档解析方案的另一种思路
  • 用meteor框架做的微博网站/小红书seo排名优化
  • 青岛开发区网站建设多少钱/南昌seo全网营销
  • 搜索引擎优化中的步骤包括/整站优化
  • 淮南家政网站建设地址/优化师是做什么的
  • 淘客网站开发视频教程/如何写推广软文
  • 一个网站怎么绑定很多个域名/百度指数教程