wince6.0下的實體地址對映和共享
wince6.0提供了兩個升級版的記憶體分配和對映函式,VirtualAllocEx和,就是在原版的基礎之上增加了一個程式控制程式碼函式,所以可以在核心驅動中先獲取呼叫者程式的控制程式碼,再用上述的兩個Ex函式,為該程式保留空間和對映實體地址。在驅動中有效是因為使用者程式是該驅動的呼叫者程式)。完成對映之後,就可以在使用者程式中直接改變實體地址的值了。
下面介紹下這個兩個函式的使用。
被對映的實體地址應該向上取整,保證為頁面的起始處。所以被對映的大小也要做相應的增加。sDevPhysAddr是被對映的起始實體地址。dwSize是對映的大小。
SourcePhys = & ~(PAGE_SIZE - 1);
SourceSize = dwSize + (sDevPhysAddr & (PAGE_SIZE - 1));
lpUserAddr=(hDesProcess, 0, SourceSize, MEM_RESERVE,PAGE_NOACCESS);其它的引數,除了程式控制程式碼外與vitrualalloc virtualcopy都是相同的。對於VirtualCopyEx來說
使用者程式的控制程式碼是目標程式控制程式碼,驅動所在的程式控制程式碼是源程式控制程式碼。
由於實體地址向上取整,所以對映完成後的虛擬地址應該做出調整:
=(LPVOID)((ULONG)lpUserAddr+(sDevPhysAddr & (PAGE_SIZE - 1)));
gUserAddr = lpUserAddr;
返回真正所需的地址。
當使用完後,釋放資源如下:
VirtualFreeEx(pvProcess,(PVOID)((ULONG)gUserAddr&~(ULONG)(PAGE_SIZE-1)),0,MEM_RELEASE);
完成上述內容,首先是做個簡單的流模式的核心驅動(見資源中心的FirstSubDll.rar),筆者在應用程式,使用者模式驅動,核心驅動三個環境下VirtualAllocEx和VitualCopyEx對映實體地址做過測試。只有核心驅動能完成,其他的都是不支援的請求。Wince6.0限制的應用程式對實體地址的訪問,提高系統的安全性,只有核心驅動(被系統信賴的)才能訪問實體地址及外圍裝置暫存器。在驅動中給出IOCTL介面,透過DeviceIoControl完成實體地址對映和資源釋放。應用載入驅動呼叫介面,獲取完成對映的虛擬地址,直接讀寫,可以改變RAM值或某個外圍裝置暫存器的值(如透過GPIO控制某個裝置的電源開關)。
前面提到過的保留好的空間地址,在核心驅動中和使用者程式中都是有效的。透過此點可以讓核心驅動和應用程式共享一段物理RAM。核心程式和使用者程式記憶體共享與複製核心驅動中的資料塊到使用者已分配的儲存空間中相比,可以節省記憶體資源和提高效率。特別是在攝影裝置中,需要大量的儲存,若不再應用和驅動中共享記憶體,就會損失大量的RAM資源。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23410886/viewspace-1031512/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- wince6.0下使用者程式訪問實體地址
- 07_Linux實體地址到虛擬地址對映Linux
- wince6.0下DeviceEmulator 基於共享資料夾的hive實現devHive
- 修改對映地址
- M3位帶地址對映和彙編實現對比
- UI與實體的對映UI
- Cache與主存之間的直接對映,全相聯對映和組項聯對映以及其地址變換
- MapStruct實體對映Struct
- Mybatis實體關聯對映MyBatis
- reactnative獲取裝置真實ip地址和ip對映的地理位置React
- win10系統下如何對映共享資料夾Win10
- mmap共享儲存對映(儲存I/O對映)系列詳解
- juniper SRX 地址埠對映設定
- JPA實體中欄位對映補充和嵌入物件物件
- JAXB(一)——初體驗之實現XML和物件之間的對映XML物件
- Fluent API 配置實體和資料庫之間的對映關係API資料庫
- 記憶體對映檔案詳解-----C++實現(即一塊記憶體和一個檔案相對映對應)記憶體C++
- 記憶體對映記憶體
- JAVA記憶體對映檔案實現多執行緒下載Java記憶體執行緒
- Java實體對映工具MapStruct詳解JavaStruct
- 基於直接地址對映的CMAC神經網路Mac神經網路
- samba共享服務安裝,開發可用對映Samba
- 域管理客戶端自動建立共享對映客戶端
- mmap記憶體對映記憶體
- RequestMappingHandlerMapping請求地址對映流程!APP
- Java實體對映工具MapStruct使用詳解JavaStruct
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- 『手寫Mybatis』實現對映器的註冊和使用MyBatis
- wince5.0下實體地址訪問
- Linux下邏輯地址、線性地址、實體地址詳細總結Linux
- Spring Boot 入門系列(二十八) JPA 的實體對映關係,一對一,一對多,多對多關係對映!Spring Boot
- 鐵威馬NAS對映共享資料夾方法教程
- iptables 實現埠對映
- mybatis 實體類排除資料庫欄位對映MyBatis資料庫
- 埠對映,內網網站對映外網訪問,透過80埠對映實現內網網站
- 實體地址、虛擬地址
- 記憶體管理概述、記憶體分配與釋放、地址對映機制(mm_struct, vm_area_struct)、malloc/free 的實現記憶體Struct
- Verilog程式碼和FPGA硬體的對映關係(四)FPGA