1. 程式人生 > >淺談mmap()和ioremap()的用法與區別

淺談mmap()和ioremap()的用法與區別

12只 設備 gpa 我們 之間 mmap ioremap shared set

一、mmap()
mmap()函數是用來將設備內存線性地址映射到用戶地址空間。
(1)首先映射基地址,再通過偏移地址尋址;
(2)unsigned char *map_cru_base=(unsigned char * )mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dev_fd, CRU_BASE);
*(volatile unsigned int *)(map_cru_base+ CRU_OFFSET) = 0xffff0180;


二、ioremap
ioremap()函數是用來將物理地址轉換為虛擬地址。
(1)volatile unsigned long *cru = NULL;
(2)volatile unsigned long *gpacru = NULL;
(3)cru = (volatile unsigned long *)ioremap(0xff760000, 0xffe);
(4)gpacru = cru+111;
註意:cru的地址為0xff760000,gpacru的基地址為0xff760378,由於0xff760378和0xff760000之間相差888,而(4)中每+1時,相當於多尋址1個字節(即:8位),此時有888/8=111,所以gpacru = cru+111。但是此時我們想要的是把0xff76037c地址處的數據改為0xffff01c0,而cru+111只能尋址到0xff760378,cru+112只能尋址到0xff760380,但是我們可以通過*gpacru = 0xffff01c000000d0a來改寫0xff76037c地址處的數據。

淺談mmap()和ioremap()的用法與區別