先說VirtualAlloc 和VirtualCopy
VirtualAlloc 首先會從我們的虛擬地址空間中申請(或者說預留)一塊虛擬空間,準備接下來要用它。注意此時,可用的物理內存並沒有減少,只是虛擬地址少了一塊可用的區域。真正把這塊之前reserved的虛擬空間映射到物理的內存區域就是由VirtualCopy來乾的,此時,MMU的頁表就會增加一個entry,來表示物理--虛擬的映射關係。
再說動態虛擬內存映射和靜態虛擬內存映射
OEMaddressTable只是建立了一個一級的靜態虛擬--物理的映射關係,一般給kernel(NK.EXE)通過直接訪問的形式來用(OALPAtoVA);
MmMapIOSpace(VirtualAlloc +VirtualCopy)是一種動態虛擬映射的手段,一般給驅動根據當前需要(對硬件操作)動態申請並建立映射。
內核部分就要用這個OEMaddressTable來轉換,wince5.0下 用戶態的驅動(wince6.0驅動貌似是在內核態)就要用這個VirtualAlloc+VirtualCopy來進行地址映射。
詳見:http://topic.csdn.net/u/20080918/18/f1dbb82a-dfac-484b-b298-ecdb61505ff8.html