Linux在應用層讀寫暫存器的方法

2021-07-24 20:00:51 字數 754 閱讀 7679

/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為了支援多個硬體體...