gpt4 book ai didi

assembly - 如何访问PCIe配置空间? (ECAM)

转载 作者:行者123 更新时间:2023-12-02 14:42:30 31 4
gpt4 key购买 nike

根据各种文章,为了访问 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com