wince5.0下實體地址訪問

honwsn發表於2010-02-27
wince5.0下實體地址對映有以下兩種方法:[@more@]

1.靜態對映

透過OAL來定義。定義了從4GB的實體地址空間到核心512MB未對映的虛擬地址空間的對映關係。核心將會從這個表中建立兩個虛擬地址空間段。一個是有緩衝的,一個是沒有緩衝的。只能在核心模式下訪問。

作為OEMAddressTable的補充,還可以呼叫CreateStaticMapping來完成實體地址到虛擬地址的對映。函式返回一個未緩衝區域的虛擬地址,當然也只能由核心訪問(an uncached memory region)。一個靜態對映只能在啟動時間(at boot time)建立而不是能夠動態建立的。一個靜態對映被建立後會一直有效直到裝置重啟。

2. 2.動態對映

主要是透過VirtualAllocVirtualCopy兩個函式來實現。首先VirtualAlloc保留好一段虛擬地址,在保留時應該指定MEM_RESERVEPAGE_NOACCESS標誌而且保留的區域大小至少為2M,因為這樣被就會分配到本程式地址空間外的地址,否則就會分配在本程式的地址空間內,會受到32M空間大小的限制。由VirualCopy來完成實體地址的對映。可以對映一段實際的RAM區域或外圍裝置的暫存器地址(這樣就可以操作外圍裝置了)。

使用VirualCopy的注意事項有虛擬地址的page offset和實體地址的page offset必須相同,因為一個虛擬地址頁只能夠被對映到一個實體地址頁,否則就會呼叫失敗。在對映一段實體地址區域時,應該指定PAGE_PHYSICALPAGE_NOCACHE, 而且保證傳入的實體地址左移8位。

wince5.0中,裝置驅動程式可以直接使用MmMapIoSpace完成實體地址到虛擬地址的對映。HalTranslateBusAddress是把某個型別的某個物理匯流排的地址轉化為實體地址(全域性的)。然後就可以使用MmMapIoSpace將實體地址對映為某個虛擬地址。TransBusAddrToVirtual直接會把一個與匯流排相關地址直接對映為可訪問的虛擬地址。

由於驅動程式和應用程式都是執行在使用者空間下。所以驅動程式有的許可權,應用程式也會有。在驅動和應用中,透過上述的動態對映方法,來訪問實體地址或控制裝置暫存器都會容易做到。Wince5.0還有核心模式與使用者模式的切換的介面6.0下已經不被支援),應用程式可以透過這個介面切換到核心模式下,可以透過靜態對映的有效虛擬地址經過MMU直接改變某個RAM的儲存內容,無需在對映,沒有地址訪問限制是核心模式下的特點。

顯而易見在wince5.0訪問實體地址和外圍裝置具有很大的自由,應用程式的許可權很大,很容易就會破壞整個系統。在接下來的wince6.0 核心有了很大的變化,虛擬記憶體模型與5.0大有不同,應用程式不能在使用者模式下直接完成實體地址的對映了(virtualcopy對映實體地址將會是個不支援的請求),只能透過核心驅動程式來完成實體地址的對映,下篇將會介紹wince6.0下訪問實體地址。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23410886/viewspace-1031504/,如需轉載,請註明出處,否則將追究法律責任。

相關文章