1

据我所知,AHCI 扩展 ROM 使用 IDP(索引/数据对)来访问 AHCI 寄存器(全局和端口寄存器)。

ahci 规范 v1.3 说:

IDP 机制允许主机软件使用间接 I/O 寻址访问所有 MMIO 寄存器

因此即使ABAR在1MB以上,扩展ROM仍然可以通过这种方式以实模式访问MMIO。

但是我们发现在访问 AHCI MMIO 寄存器时,下面的扩展方式是可以的:

push 0000h
pop es         ; set es = 0
mov bx, F732h
shl ebx, 16
mov bx, 0000h  ; put ABAR to ebx register
mov eax, es:[ebx]  ; read AHCI CAP registers to eax(4byte)

如果上面没问题那么说明现在的内存模型不是实模式(我猜是大实模式,也就是4G下可以访问)

我们的问题是,现在 BIOS 将控制权转移到扩展时的内存模型是否是大实模式(无论如何,不​​是实模式)?如果是,那么我们总是可以使用内存操作来访问 AHCI 的 MMIO... 对吗?

  • 之前使用IDP的原因可能是:那个时候控制权交给扩展还是实模式吧?所以内存模型取决于系统 BIOS,对吗?
4

1 回答 1

2

大实模式下BIOS将控制权转移到Expansion ROM时的内存模型? 不总是。

一般来说,系统可能会处于大实模式,但如果您正在开发将在任意 BIOS 上运行的 ROM,这不是一个安全的假设!如果 BIOS 支持 PMM(后内存管理器),那么系统应该处于大实模式,否则无法保证这一点。据我所知,即使 BIOS 支持 PMM,也只有初始选项 ROM 执行才能保证大实模式。

这样做可能会更安全:

  • 仅对 AHCI 寄存器使用传统 I/O 访问(这也是最简单的)
  • 首先检查 BIOS 是否支持 PMM,然后使用传统 I/O 或 MMIO(但仅在 BIOS 选项 ROM 初始化期间)
  • 继续,将 CPU 置于大实模式并使用 MMIO 访问这些寄存器(为了获得奖励积分,您可以将系统恢复到您找到它的状态,但大多数 BIOS 会在您之后清理)

之前使用IDP的原因可能是:那个时候控制权交给扩展还是实模式吧? 不完全是。

这很可能是因为它是最安全和最简单的选择,因为无法保证系统将处于大实模式(因此使用 1MB 以上的 MMIO 访问是安全的)。

所以内存模型取决于系统 BIOS,对吗? 不(有一个警告)。

当 BIOS 将控制权移交给引导加载程序或选项 ROM 时,系统应该处于实模式。大实模式基本上是这种模式的扩展,但 BIOS 不会将系统置于其他其他模式(任何保护模式、长模式等)。


链接:

http://bioshacking.blogspot.com/2011/07/memory-management-in-legacy-bios.html
http://lists.ipxe.org/pipermail/ipxe-devel/2012-August/001736.html
http: //wiki.osdev.org/Unreal_Mode
http://www.linkedin.com/groups/PCI-extension-memory-allocation-4330449.S.99498421

简短的免责声明:这实际上仅适用于具有传统支持的传统 BIOS 或 UEFI。如果有任何错误,我提前道歉!

于 2013-07-11T21:19:41.283 回答