我知道AHCI扩展ROM使用IDP(索引/数据对)来访问AHCI寄存器(全局和端口寄存器)。
ahci spec v1.3说:
IDP机制允许主机软件访问所有MMIO 使用间接I / O寻址的寄存器
因此即使ABAR超过1MB,扩展ROM仍然可以通过这种方式访问MMIO in real mode 。
但是我们发现在访问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 ......这是正确的吗?
答案 0 :(得分:2)
BIOS是否在大实模式下将控制权转移到扩展ROM时的内存模型? 并非总是如此。
一般情况下,系统可能处于大型实模式,但如果您正在开发一个可在任意BIOS上运行的ROM,这不是一个安全的假设!如果BIOS支持PMM(Post Memory Manager),那么系统应该处于大实模式,否则无法保证这一点。据我所知,即使BIOS支持PMM,也只保证初始选项ROM执行处于大实模式。
可能更安全:
之前使用IDP的原因可能是:当控制权转移到扩展时仍然是实模式,对吗? 不完全。
< / p>
这很可能是因为它是最安全和最简单的选择,因为无法保证系统将处于大实模式(因此使用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。如果有任何错误,我会提前道歉!