wince下的位址對映知識點滴

2021-05-02 20:37:43 字數 1440 閱讀 3263

引自:http://blog.csdn.net/gooogleman/archive/2008/07/29/2731747.aspx

1.如果是在bootloader中訪問裝置暫存器,可以直接操作實體地址。

2.wince啟動後,硬體上arm和x86體系的處理器啟動了mmu,作業系統只能訪問到虛擬位址,不能直接操作物理記憶體了。但是如果是x86的cpu,由於它的外設i/o埠和儲存器空間分開編址,可以直接嵌入彙編或者使用巨集read_port_***,write_port_***來讀寫裝置暫存器的實體地址。

3.wince軟體結構裡對應mmu的是乙個名為oemaddresstable的資料結構(原始檔oeminit.asm中),其中建立了實體地址和虛擬位址的靜態對映關係,也可以在其中改動系統所能識別物理記憶體的大小,以支援大記憶體。

5.建立了靜態對映關係的虛擬位址只能由核心模式下的程式來操作,例如 isr。除非你在定製系統時,選擇了full kernal mode,使所有程式都執行在完全核心模式下,這將導致系統不穩定。

6.如果要在驅動程式中訪問裝置暫存器,必須建立動態虛擬位址對映,可以呼叫mmmapiospace函式來實現,或者通過virtualalloc和virtualcopy函式來實現。其實mmmapiospace內部就呼叫了後者。

7.在驅動中訪問虛擬位址時,必須是非快取段(位於0xa0000000 到 0xbfffffff )。

8.使用virtualcopy函式對映物理記憶體時,其lpvsrc引數必須右移8位,且相應的fdwprotect引數必須帶page_physical。

9.如果是arm體系的處理器,訪問掛在系統匯流排上的裝置暫存器前,必須先把匯流排位址轉化成cpu的位址,通過haltranslatebusaddress實現兩種實體地址的變換,然後再呼叫mmmapiospace函式作虛實位址的轉換。

wince5.0下可以使用createbusaccesshandle(匯流排登錄檔路徑)+bustransbusaddrtovirtual來實現匯流排實體地址到系統虛擬位址的直接變換。

# #re: virtualalloc和virtualcopy的蘊含知識點 2007-10-15 14:50 milkyway

你的理解是正確的。可以簡單認為,只要設定了page_physical 為真,那麼就需要把lpvsrc右移8位。  

# re: virtualalloc和virtualcopy的蘊含知識點 2008-06-16 09:43 鄒曉均

聽君一席話,勝讀十年書啊!!!

這兩天一直在看windows記憶體管理,對頁面和粒度這兩個概念模糊,直到看到老兄這段話,茅塞頓開,十分感謝!!!

virtualalloc用來在程序的虛擬位址空間中保留(reserve)或者提交(commit)頁。在保留時以64kb為粒度,即保留空間以64k為單位。而提交虛擬位址時,則以頁(典型大小為4kb)為單位。

在保留時以64kb為粒度,即保留空間以64k為單位。而提交虛擬位址時,則以頁(典型大小為4kb)為單位  

WinCE下的位址對映以及暫存器訪問

1.如果是在bootloader中訪問裝置暫存器,可以直接操作實體地址。2.wince啟動後,硬體上arm和x86體系的處理器啟動了mmu,作業系統只能訪問到虛擬位址,不能直接操作物理記憶體了。但是如果是x86的cpu,由於它的外設i o埠和儲存器空間分開編址,可以直接嵌入彙編或者使用巨集read ...

Linux下的位址對映

在cpu中設定四個 段暫存器 cs ds ss es 分別用於可執行 即指令,資料,堆疊和其他 每個段暫存器都是16位,對應位址匯流排的高16位。每條 訪內指令 的內部位址都是16位。訪內 的內部位址 16位 轉化成實際位址 20位 段暫存器中內基位址 4 內部位址 對於每乙個由段暫存器的內容確定的...

linux下的分段分頁 位址對映

首先我們要注意的是虛擬空間分為核心空間和使用者空間。1.從邏輯位址到線性位址的轉換 對於linux來說,基本不使用分段的機制,或者說,linux中的分段機制只是為了相容ia32的硬體而設計的。linux核心的設計並沒有全部採用intel所提供的段方案,僅僅有限度地使用了一下分段機制。這不僅簡化了li...