在某些情況下,需要移植的**是直接訪問暫存器的,當移植到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為了支援多個硬體體...