1.如果是在bootloader中打開MMU之前,程序訪問設備寄存器,可以直接操作物理地址,無需虛實映射。
2.wince啟動后,硬件上ARM和X86體系的處理器啟動了MMU,操作系統(tǒng)只能訪問到虛擬地址,不能直接操作物理內(nèi)存了。但是如果是X86的CPU,由于它的外設I/O端口和存儲器空間分開編址,可以直接嵌入?yún)R編或者使用宏read_port_xxx,write_port_xxx來讀寫設備寄存器的物理地址。
3.wince軟件結構里對應MMU的是一個名為OEMAddressTable的數(shù)據(jù)結構(
源文件oeminit.asm中),其中建立了物理地址和虛擬地址的
靜態(tài)映射關系,也可以在其中改動系統(tǒng)所能識別物理內(nèi)存的大小,以支持大內(nèi)存。
4.我們也可以在wince啟動后調(diào)用CreateStaticMapping和NKCreateStaticMapping來實現(xiàn)OEMAddressTable中的這種物理地址和虛擬地址的
靜態(tài)映射關系。
5.建立了靜態(tài)映射關系的虛擬地址只能由內(nèi)核模式下的程序來操作,例如 ISR。除非你在定制系統(tǒng)時,選擇了full kernal mode,使所有程序都運行在完全內(nèi)核模式下,這將導致系統(tǒng)不穩(wěn)定。
6.如果要在驅(qū)動程序中訪問設備寄存器,必須建立
動態(tài)虛擬地址映射,可以調(diào)用MmmapIoSpace函數(shù)來實現(xiàn),或者通過VirtualAlloc和VirtualCopy函數(shù)來實現(xiàn)。其實MmmapIoSpace內(nèi)部就調(diào)用了后者。
7.在驅(qū)動中訪問虛擬地址時,必須是非緩存段(位于0xA0000000 到 0xBFFFFFFF )。
8.使用VirtualCopy函數(shù)映射物理內(nèi)存時,其lpvSrc參數(shù)必須右移8位,且相應的fdwProtect參數(shù)必須帶page_physical。
9.如果是ARM體系的處理器,訪問掛在系統(tǒng)總線上的設備寄存器前,必須先把總線地址轉化成
CPU的地址,通過HalTranslateBusAddress實現(xiàn)兩種物理地址的變換,然后再調(diào)用MmmapIoSpace函數(shù)作虛實地址的轉換。
wince5.0下可以使用CreateBusAccessHandle(總線注冊表路徑)+BusTransBusAddrToVirtual來實現(xiàn)總線物理地址到系統(tǒng)虛擬地址的直接變換。