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

2021-08-13 10:21:42 字數 882 閱讀 7841

在某些情況下,需要移植的**是直接訪問暫存器的,當移植到linux時,可利用mmap建立乙個適配層,減少開發工作量。

通過操作/dev/mem裝置檔案,以及mmap函式,將暫存器的位址對映到使用者空間,直接在應用層對暫存器進行操作。

mmap的使用示例:

#define reg_area_len 1024

static int halfileh = -1;

unsigned long gregbase = 0;

halfileh = open("/dev/mem", o_rdwr|o_sync);

if (halfileh < 0)

(void)fcntl(halfileh, f_setfd, fd_cloexec);

pvirtbuffaddr = (uint32_t *)mmap(0, reg_area_len, prot_read|prot_write, map_shared, halfileh, physicaladdress);

if ((pvirtbuffaddr == null) || (pvirtbuffaddr == map_failed))

gregbase = (unsigned long)pvirtbuffaddr;

return hal_ok;

}/*!

* hal exit point. 

* unmaps registers. 

*/int halterminate(void)

munmap((uint32_t *)gregbase, reg_area_len);

close(halfileh);

halfileh = -1;

gregbase = 0;

return hal_ok;

}

Linux在應用層讀寫暫存器

先說結論 在應用層可以通過操作 dev mem裝置檔案,以及mmap函式,將暫存器的位址對映到使用者空間,然後直接在應用層對暫存器進行操作。該裝置檔案是物理記憶體的全映像,通過分析dev mem裝置驅動可以知道,通過這個裝置檔案可以對映整個處理器的位址空間,而不單單是記憶體。這裡的位址空間指的是處理...

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

dev mem 物理記憶體的全映象。可以用來訪問物理記憶體。由於應用執行都在使用者空間,使用的是虛擬記憶體,不能直接訪問實體地址空間,通過 dev mem檔案可以用來訪問系統的全部定址空間。dev kmem kernel看到的虛擬記憶體的全映象。可以用來訪問kernel的內容。在開啟mmu之前,你可...

Linux下讀寫暫存器

arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...