日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VirtualAlloc和VirtualCopy的蕴含知识点

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的蕴含知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。