【问题标题】:accessing pci configuration space in real mode以实模式访问 pci 配置空间
【发布时间】:2022-01-02 06:01:48
【问题描述】:

我正在尝试编写程序集以访问 pci 配置空间。

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

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

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

【问题讨论】:

  • 是的,32 位操作在实模式下工作正常。它们使用操作数大小覆盖前缀进行编码。只需确保您的汇编器设置为 16 位模式并写入 out dx, eax,您的汇编器就会发出带有前缀的它。
  • 该代码专门使用pushad/popad,因此它可以汇编为16位模式并仍然保存完整的寄存器,而不是pusha/popa,它可能汇编为@987654329 @ 在某些汇编程序中的 bits 16 模式中。你可以试试看mov eax, 123456 是如何汇编成 16 位代码的。

标签: assembly x86 intel pci


【解决方案1】:

pci 配置必须通过 32 位数据访问...我可以在实模式下执行此操作吗?

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

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

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

【讨论】:

  • 感谢您的回答!我要访问的寄存器是芯片组配置寄存器,它有 16 位偏移值... 0400h-0403h ...但是 pci 配置机制 1 只有位 2-7,这是 6 位可用于偏移值...和芯片组数据表说 pci 配置空间是通过配置机制 1 访问的……你知道为什么吗????以及如何访问它?
  • 对不起,我想你可能已经回答过了...它是通过内存映射方法...我会调查的。谢谢
  • 数据表说明了! " 这个块使用根复基地址映射到内存空间..."
  • @MK:通常(对于 IO 端口访问机制)您访问整个 32 位值;然后使用掩码/移位来选择较大的 32 位块中的较小字段(例如 uint16_t foo = PCI_readDword(offset & 0xFC) >> 16; 可能)。
猜你喜欢
  • 2016-07-18
  • 2019-02-07
  • 2012-07-06
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2017-03-16
  • 2015-01-04
  • 2018-05-31
相关资源
最近更新 更多