为了访问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
,意思是vendor ID = 0x8086
和device ID = 0x1237
。
这里有个问题。
Q1.我已经看到这种方法只适用于PCI配置空间。那么,访问PCIe配置空间的另一种方法是什么?
“不能使用遗留的PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间”
但其他一些文章说,这种遗留方法也与PCIe配置空间兼容。
这太让人困惑了。
Q2.如果遗留的0xCF8,0xCFC也能与PCIe配置空间一起工作,那么将真正感谢NASM汇编的详细源代码(而不是关于linux),因为我已经看过很多ECAM(增强型配置访问机制)的文章,但它们都是关于概念内容的。
硬件规范:
Motherboard : P775TM1
Processor : Intel i7 8700K
发布于 2019-08-12 12:56:17
你读了这句话
无法使用遗留的PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间。
脱离上下文。
以下是上下文中的引文(重点是我的引文):
-- PCI总线将配置空间从256个字节扩展到4096字节。不能使用遗留PCI方法(通过端口0xCF8和0xCFC)访问此扩展配置空间。
作者讨论的是从0x100开始的PCIe配置空间的一部分。
在开始时,每个PCI设备函数都有一个256字节的配置空间。
这个空间是在端口0xcf8和0xcfc上使用PCI遗留机制访问的(我们可以忽略两个机制的事实)。
PCIe将这个空间从256个字节扩展到4KiB,并引入了一种新的机制来访问配置空间(全部)。
因此,简单地说:
引用PCIe规范:
per将配置空间扩展到每个函数4096字节,而PCI本地总线规范允许256字节。PCI配置空间被划分为一个与PCI3.0兼容的区域,该区域由函数配置空间的前256个字节组成,而一个PCI扩展配置空间由其余的配置空间组成(参见图7-3)。可以使用PCI规范NdR中定义的机制访问PCI3.0兼容的配置空间:传统配置机制或本节后面描述的PCI增强配置访问机制。使用任何一种访问机制进行的访问都是等效的。PCI Express扩展配置空间只能通过使用ECAM.访问。
它的非常(很可能),英特尔的CPU将支持遗留的PCI配置机制许多年以后。
在内部,生成PCI配置事务(即系统代理/UBox)的uncore部分已经只使用PCIe配置事务(即与ECAM生成的相同的MMCFG类型),但遗留的软件接口没有被删除。
由于PCIe根复合体位于CPU内,所以当涉及到传统的PCI 软件兼容性时,CPU是唯一关心的问题(遗留PCI需要一个PCIe到PCI桥接器,它可能会公开配置机制)。
简而言之,您可以安全地使用遗留的PCI机制访问PCIe配置空间的前256个字节(每个函数)。
实际上,除非Intel找到一种新的方法来配置非核心设备,否则遗留机制将永远不会消失,因为它需要配置ECAM本身。
遗留机制是直接使用的,您已经发布了一些使用它的代码。我不知道还需要什么。
你可以这样使用它:
%define CFG(bus, dev, fun, reg) (0x80000000 | (bus << 16) | (dev << 11) | (fun << 8) | reg)
%macro cfg_arm 4
mov dx, 0cf8h
mov eax, CFG(%1, %2, %3, %4)
out dx, eax
%endmacro
%macro cfg_read 4
cfg_arm %1, %2, %3, %4
mov dx, 0cfch
in eax, dx
%endmacro
%macro cfg_write 5
cfg_arm %1, %2, %3, %4
mov dx, 0cfch
mov eax, %5
out dx, eax
%endmacro
cfg_read 0, 0, 0, 0 ;eax <- VID:DID of dev 0, fun 0 on bus 0
这段代码是未经测试的
如果您指的是配置空间的内容(即设置什么),那就太宽泛了。
您可以读取感兴趣的设备的数据表,它们通常记录在PCI规范中定义的标准寄存器。
或者,您可以读取PCI规范本身。
如果你在问如何使用ECAM,请阅读Brendan的答案。
我能补充的唯一一点是,对于您的CPU,您可以通过从CPU的iMC的(旧的) PCI配置空间读取寄存器PCIEXBAR (偏移60h)来找到ECAM的基础(总线0、dev 0、by 0)。
就像这样:
cfg_read 0, 0, 0, 60h ;Low 32-bit
mov ebx, eax
cfg_read 0, 0, 0, 64h ;high 32-bit
shl rax, 32
or rax, rbx ;RAX = ptr to ECAM area
固件已经配置了一切,以正确地使用该区域。
发布于 2019-08-12 09:26:59
Q1。我已经看到这种方法只适用于PCI配置空间。那么,访问PCIe配置空间的另一种方法是什么?
对于80x86个人计算机,实际上有3种访问PCI配置空间的机制。您提到的遗留机制(使用IO端口0x0CF8和0x0xCFC)是“机制#1”。还有另一种名为“机制#2”的遗留机制,它也使用了0x0CF8和0x0xCFC;但是许多芯片组并没有使用它,而且(对于现代计算机)可以被认为是过时的。
最初,每个PCI“函数”的PCI配置空间大小为256字节;对于这两种遗留机制,您只能访问256字节。当他们发明PCI时,他们增加了第三种机制(内存映射的ECAM),他们还将每个PCI“函数”的PCI配置空间增加到4096字节。遗留的“机制#1”仍然可以工作,但仍然只能访问前256个字节(在PCI“函数”可以拥有的4096字节中)。幸运的是,硬件制造商足够聪明地确保旧操作系统需要访问的内容在前256个字节之内,因此不支持PCI的旧操作系统仍然工作(使用“机理#1"),而4096字节(没有ECAM就无法访问)的其余部分主要用于诸如PCI扩展功能。
注意:它有可能有一个" PCI -E到PCI常规“桥接器,与PCI传统设备后桥。在这种情况下,传统的PCI设备/函数将只提供256字节的PCI配置空间,即使它仍然在使用ECAM。
要使用ECAM;您需要使用ACPI的“表索引”(RSDT或XSDT)来找到一个名为"MCFG“的表。可悲的是(除非我上次查看后它已经改变了)这个表不是在ACPI规范中描述的,而是在一个“极其昂贵的”PCI SIG付费墙后面的PCI规范中描述的。希望你能在某个地方找到可靠的第三方描述。
一般来说,MCFG表由描述要用于一系列总线号码的地址范围的条目组成;对于多个不同的总线号码范围,可能有多个不同的地址范围。这样做的想法是使用设备的总线号来查找正确区域的地址;然后将"address_of_area + ((bus - first_bus_for_area) << 20) | (device << 15) | (function << 12)
“组合起来,以找到函数的PCI配置空间的起始地址。一旦找到,您就可以在物理页面中读取/写入偏移量/s,以访问函数的PCI配置空间中的相应偏移量。
https://stackoverflow.com/questions/57457283
复制相似问题