2013-07-10 84 views
1

因爲我知道AHCI擴展ROM使用IDP(索引/數據對)來訪問AHCI寄存器(全局和端口寄存器)。bios將控制權交給AHCI擴展ROM時的內存模型?

的AHCI規範V1.3說:

的IDP機制允許主機軟件使用間接I/O尋址

因此,即使是ABAR 1MB以上訪問所有MMIO 寄存器擴展ROM仍然可以通過這種方式訪問​​實模式中的MMIO

但我們發現下面的方式擴張中是OK的時候訪問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) 

如果上面是OK則意味着內存模型現在是不是真正的模式(我想這是大實模式,也就是4G下的接入就OK)

我們的問題是如果BIOS把控制權交給擴展的內存模型現在是大實模式(反正不是實模式)?如果是,那麼我們總是可以使用內存操作來訪問AHCI的MMIO ......這是正確的嗎?

  • 之前IDP使用過的原因可能是:當時控制傳遞給擴展仍然是實模式,對嗎?所以內存模型依賴於系統BIOS,對吧?

回答

2

是BIOS在大實模式下將控制權交給擴展ROM時的內存模型?並非總是如此。

一般來說,系統可能會處於大實模式,但是如果您正在開發可在任意BIOS上運行的ROM,這不是一個安全的假設!如果BIOS支持PMM(Post Memory Manager),那麼系統應該處於大實模式,否則不能保證這一點。據我所知,即使BIOS支持PMM,只有初始選項ROM執行才能保證處於大實模式。

它可能會更安全:

  • 僅使用傳統I/O爲AHCI訪問寄存器(這也是最簡單的)
  • 檢查,看是否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與傳統支持。如果有任何錯誤,我會提前道歉!