据我所知,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,对吗?