以实模式访问 pci 配置 space

accessing pci configuration space in real mode

我正在尝试编写程序集来访问 pci 配置 space。

我想做的基本上就是这篇文章所做的。

https://sites.google.com/site/pinczakko/pinczakko-s-guide-to-award-bios-reverse-engineering

我的问题是,因为我试图在实模式下执行此操作,而 pci 配置必须由 32 位数据访问...我可以在实模式下执行此操作吗?像 eax 这样的寄存器可以在实模式下访问吗?还是我需要进入保护模式才能执行此操作?

pci configuration has to be accessed by 32 bits data... can I do this in real mode?

是; “实模式”仅表示默认操作数大小为 16 位,但您(汇编程序)可以使用大小覆盖前缀更改默认值。

当然,这只适用于 32 位 CPUs(80386 或更高版本),但我怀疑你会在意,因为那些旧的计算机无论如何都不支持 PCI(但最好有一个“CPU 支持 32 位吗?”检查以避免在非常老的计算机上没有任何解释的崩溃。

对于较新的计算机(使用 PCI express)“PCI 配置 space”每个功能增加到 4 KiB(从原来的 256 字节 PCI 配置 space 每个功能)和新内存添加了映射 PCI 配置 space 机制以使其更快(没有慢速 IO 端口)。您将无法在实模式下使用内存映射 PCI 配置 space 机制。幸运的是(出于向后兼容性的原因);仍然支持旧的“IO 端口”访问机制(但只允许您访问每个函数的 4096 字节的前 256 个字节)并且每个函数的额外 PCI 配置 space 主要用于您不会使用的东西无论如何都可以使用(例如消息信号中断,电源管理,...)。