/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()來**資源。
Linux在應用層讀寫暫存器
先說結論 在應用層可以通過操作 dev mem裝置檔案,以及mmap函式,將暫存器的位址對映到使用者空間,然後直接在應用層對暫存器進行操作。該裝置檔案是物理記憶體的全映像,通過分析dev mem裝置驅動可以知道,通過這個裝置檔案可以對映整個處理器的位址空間,而不單單是記憶體。這裡的位址空間指的是處理...
Linux在應用層讀寫暫存器的方法
在某些情況下,需要移植的 是直接訪問暫存器的,當移植到linux時,可利用mmap建立乙個適配層,減少開發工作量。通過操作 dev mem裝置檔案,以及mmap函式,將暫存器的位址對映到使用者空間,直接在應用層對暫存器進行操作。mmap的使用示例 define reg area len 1024 s...
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...