/dev/mem:物理內存的全鏡像。可以用來訪問物理內存。由於應用運行都在用戶空間,使用的是虛擬內存,不能直接訪問物理地址空間,通過/dev/mem文件可以用來訪問系統的全部尋址空間。
/dev/kmem:kernel看到的虛擬內存的全鏡像。可以用來訪問kernel的內容。
在開啟MMU之前,你可以直接用物理地址訪問。在開啟MMU之后,你需要先將物理地址映射為虛擬地址,然后用虛擬地址訪問。還是絕個簡單的例子,比如某一個外設的寄存器物理地址為:
regaddr = 0x0200000,要讀出/寫入的值為value(unsigned int類型);那么:
①、在開啟MMU之前:
讀:
value = *(volatile unsigned int*)regaddr;
寫:
*(volatile unsigned int*)regaddr = value;
②、在開啟MMU之后:
需要先用ioremap來做映射,如下
unsigned int virt_regaddr = 0;
virt_regaddr = ioremap (regaddr, sizeof (unsigned int));
讀:
value = *(volatile unsigned int *)virt_regaddr;
寫:
*(volatile unsigned int*)virt_regaddr = value;
當然,如果不使用了,記得用iounmap()來回收資源。