- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据各种文章,为了访问 PCI 配置空间,使用 I/O 端口地址 0xCF8、0xCFC。
mov eax, dword 0x80000000
mov dx, word 0x0CF8
out dx, eax
mov dx, word 0x0CFC
in eax, dx
上述代码中eax的值为0x12378086
,这意味着供应商ID = 0x8086
和设备ID = 0x1237
。
问题来了
第一季度。我发现这种方法仅适用于 PCI 配置空间。那么,访问 PCIe 配置空间的另一种方法是什么?
“无法使用传统 PCI 方法(通过端口 0xCF8 和 0xCFC)访问此扩展配置空间”
https://wiki.osdev.org/PCI_Express
但其他一些文章称这种传统方法也与 PCIe 配置空间兼容。
这很令人困惑。
第二季度。如果旧版 0xCF8、0xCFC 也能与 PCIe 配置空间配合使用,那么详细的 NASM 汇编源代码(与 linux 无关)将得到真正的赞赏,因为我已经看过很多 ECAM(增强配置访问机制)文章,但它们都是关于概念内容。
硬件规范:
Motherboard : P775TM1
Processor : Intel i7 8700K
最佳答案
Q1. I've seen this method only works for PCI Configuration Space. Then, what is the other method to access PCIe Configuration Space?
对于 80x86 PC,实际上有 3 种机制来访问 PCI 配置空间。您提到的旧机制(使用 IO 端口 0x0CF8 和 0x0xCFC)是“机制 #1”。还有另一种遗留机制称为“机制#2”,它也使用 0x0CF8 和 0x0xCFC;但它并没有被许多芯片组使用,并且(对于现代计算机)可以被认为是过时的。
最初每个 PCI“功能”的 PCI 配置空间大小为 256 字节;对于这两种旧机制,您只能访问 256 字节。当他们发明 PCI-E 时,他们添加了第三种机制(内存映射 ECAM),并且还将每个 PCI-E“功能”的 PCI 配置空间大小增加到 4096 字节。传统的“机制#1”仍然有效,但仍然只能访问前 256 个字节(PCI-E“功能”可以具有的 4096 个字节)。幸运的是,硬件制造商足够聪明,可以确保旧操作系统需要访问的内容位于前 256 个字节内,因此不支持 PCI-E 的旧操作系统仍然可以工作(使用“机制#1”),其余 4096 字节(没有 ECAM 就无法访问)主要用于 PCI-E 扩展功能等。
注意:可以有一个“PCI-E 到 PCI 常规”桥接器,桥接器后面有 PCI 常规设备。在这种情况下,PCI 传统设备/功能将仅提供 256 字节的 PCI 配置空间,即使它仍然使用 ECAM。
使用ECAM;您需要使用 ACPI 的“表索引”(RSDT 或 XSDT)来查找名为“MCFG”的表。遗憾的是(除非自从我上次查看后它发生了变化)这个表在它所属的 ACPI 规范中没有描述;相反,它是在 PCI 规范中描述的,该规范被锁定在“恶意昂贵”的 PCI SIG 付费墙后面。希望您能在某处找到可靠的第三方描述。
一般情况下; MCFG 表由描述用于一系列总线编号的地址范围的条目组成;并且对于多个单独的总线编号范围可能存在多个不同的地址范围。这个想法是使用设备的总线号来查找正确区域的地址;然后组合“address_of_area + ((bus - first_bus_for_area) << 20) | (device << 15) | (function << 12)
”来查找函数的PCI配置空间的起始地址。一旦找到,您就可以读/写该物理页内的偏移量,以访问函数 PCI 配置空间中的相应偏移量。
关于assembly - 如何访问PCIe配置空间? (ECAM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57457283/
根据各种文章,为了访问 PCI 配置空间,使用 I/O 端口地址 0xCF8、0xCFC。 mov eax, dword 0x80000000 mov dx, word 0x0CF8 out dx,
我是一名优秀的程序员,十分优秀!