VirtualAlloc和VirtualCopy的蕴含知识点
VirtualAlloc和VirtualCopy的蘊含知識點
1.VirtualAlloc用來在進程的虛擬地址空間中保留(reserve)或者提交(commit)頁。在保留時以64KB為粒度,即保留空間以64K為單位。而提交虛擬地址時,則以頁(典型大小為4KB)為單位。?
2.VirtualCopy用來綁定一塊物理內存到當前進程虛擬地址空間。參數里的lpvSrc既可以是內核段的虛擬地址也可以是物理地址(用page_physical來標記)。同時要注意lpvSrc的右移與否。?
3.使用VirtualAlloc要包含Winbase.h;使用VirtualCopy時要包含plfuncs.h.兩者都要鏈接coredll.lib.?
4.在CE5.0之前,使用VirtualAlloc獲得的虛擬地址空間分為兩種情形:?
(1)大小在2MB以下時,位于調用進程的虛擬空間中;?
(2)大小大于2MB時,位于用戶態的共享地址空間內(0x42000000-0x7E000000 )
?
ce5.0跟6.0在gpio開發方面的區別——virtualcopy和deviceiocontrol
2010年01月22日 星期五 15:24
???? 之前在5.0下,gpio的地址映射可以直接用virtualcopy映射,現在6.0底下出現非法地址調用,百度到以下有價值的一篇文章~原來在6.0下為了增加安全性,已經禁止在用戶態下的virtualcopy的使用。
引用如下----------------------------------------------------------------------------------------------------------------
在CE4.2/5.0里面滾打多年的兄弟應該經常用這個函數吧。這個函數方便驅動和應用程序范圍任何的物理地址,包括物理內存啊,設備控制器的寄存器啊,甚至GPIO也可以在AP里面隨便拉上拉下。
這個函數雖然方便,但是并不安全,你想你好不容易把一個功能完善的image給build出來了,結果碰到了一個寫AP的“高手”,把你的寄存器和共享內存中的數據修改得一塌糊涂,最后報出bug來說你驅動的你會不會暈倒!
還好從CE6.0開始我們可以安枕無憂了,因為AP再也不能調用VirtualCopy函數來直接訪問物理地址了,但因此帶來了一些應用上的不便。
VirtualCopy的限制來源于CE6.0之后kernel的巨大變革,在CE5.0之前的Windows CE操作系統中,kenrel就僅僅是kern.exe(nk.exe),這個exe其實是OAL、KITL和Kernel三個的合體,nk.exe是運行于內核模式(kernel mode),也就具有了訪問特殊地址的權限,然后除此之外的代碼默認都是運行于用戶模式(user mode),所以它們的驅動和AP都是等級的,都在用戶模式運行,要運行在kernel模式也可以,調用一個API SetKmode()就行了。因為驅動是肯定要訪問物理地址的,所以CE5.0以前的OS都是運行用戶模式的程式訪問物理地址的,然后又為了方便做從物理地址到虛擬地址的映射,就提供了一系列的幫助函數,virtualcopy就是最常用的函數之一。
CE6.0開始,kernel模式變得比較正規,類似于臺式機上的windows系統了,驅動和ap的權限是嚴格區分的,大部分的驅動程序運行在kernel模式,它們可以用virtualcopy讀寫物理地址對應的物理設備,但用戶模式的AP將從此沒有直接訪問物理地址的權限,virtualcopy每次調用都會失敗返回。
在這里還要注意的是,其實并不是用戶模式就不能使用virtualcopy,virtualcopy只是不能在用戶模式的AP中使用,但是卻還可以在用戶模式的驅動使用,但是在用戶模式的驅動中使用也有條件,那就是必須在對應的注冊表中設置可以訪問的內存地址的范圍才行。
在某些場合,一些特殊功能的AP確實需要訪問物理地址的,比如設置保存物理內存指定位置的全局變量,開發讀寫GPIO的測試工具等等。在這種情況下一種簡單的方法是實現一個最簡單的跑在kernel模式的流驅動,提供一個deviceiocontrol的接口來幫助AP申請對應于物理內存地址的虛擬內存地址。
除了virtualcopy之外,CE6下還有很多API是AP和user模式的驅動不能調用的,給大家參考一下,大家要把CE50下的AP移植到6.0下一定要注意找到替代
Virtual Memory APIs?
CeVirtualSharedAlloc?
LockPages?
LockPagesEx?
UnlockPages?
UnlockPagesEx?
VirtualAllocCopyEx?
VirtualCopyEx?
VirtualSetAttributes?
CreateStaticMapping?
NKDeleteStaticMapping?
VirtualCopy
File System APIs?
ReadRegistryFromOEM?
SetStoreQueueBase?
WriteRegistryToOEM
Power APIs?
PowerOffSystem (很多測試AP用到)
Miscellaneous APIs?
SetOOMEvent
#define IOP_BASE 0xB1600000 // 0x56000000
虛擬地址=物理>>4位 + 0xac000000
總結
以上是生活随笔為你收集整理的VirtualAlloc和VirtualCopy的蕴含知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果“最没存在感”新品要来了:新款Hom
- 下一篇: 苹果iOS 16系统支持横向人脸解锁:老