VirtualAlloc和VirtualCopy----VirtualFree
VirtualAlloc 和VirtualCopy
VirtualAlloc 首先會從我們的虛擬地址空間中申請(或者說預留)一塊虛擬空間,準備接下來要用它。注意此時,可用的物理內存并沒有減少,只是虛擬地址少了一塊可用的區域。
真正把這塊之前reserved的虛擬空間映射到物理的內存區域就是由VirtualCopy來干的,此時,MMU的頁表就會增加一個entry,來表示物理--虛擬的映射關系。
???
VirtualFree
VirtualFree 釋放內存(映射->分配/分配->空閑/映射->空閑)
??
再說動態虛擬內存映射和靜態虛擬內存映射
OEMaddressTable只是建立了一個一級的靜態虛擬--物理的映射關系,一般給kernel(NK.EXE)通過直接訪問的形式來用(OALPAtoVA);
MmMapIOSpace(VirtualAlloc +VirtualCopy)是一種動態虛擬映射的手段,一般給驅動根據當前需要(對硬件操作)動態申請并建立映射。
?
?
那就是說VirtualCopy 可以直接把物理內存映射到虛擬內存中
而OEMaddressTable所建立的靜態虛擬--物理的映射不是必須的
也就是說比如對寄存器的映射:
可以通過VirtualAlloc申請(預留)一塊虛擬內存給寄存器(如:v_pIOPregs)
然后用
VirtualCopy直接把寄存器的物理地址映射到剛才申請(預留)的虛擬地址空間
而在OEMaddressTable中所做的寄存器物理地址與虛擬地址的映射這步可以省略
不是省略不省略的問題,是這兩種方法是在不同的場合下使用的,如2樓說的,內核部分就要用這個OEMaddressTable來轉換,wince5.0下 用戶態的驅動(wince6.0驅動貌似是在內核態)就要用這個VirtualAlloc+VirtualCopy來進行地址映射。
OEMaddressTable的定義,你可以查看 bsp/src/inc/oemaddrtab_cfg.inc ,那個g_oalAddressTable便是。
總結
以上是生活随笔為你收集整理的VirtualAlloc和VirtualCopy----VirtualFree的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hotspot垃圾回收
- 下一篇: Windows内存管理 - 隐藏在new