mmap 和 VMA

 
lseek - move the read/write file offset
off_t lseek(int fildes, off_t offset, int whence);
參考網址

由 user process 角度來說明的話,VMA 是 user process 裡一段 virtual address space 區塊;virtual address space 是連續的記憶體空間,當然 VMA 也會是連續的空間。VMA 對 Linux 的主要好處是,可以記憶體的使用更有效率,並且更容易管理 user process address space。

要在AP中直接設定裝置或者直接存取實體記憶體位址,
在作業系統的保護下,通常要透過ioctl或read/write方法。

但是對於大量資料進出,比如video或streaming這樣的方法就顯的效能很低,所以Linux提供了另外一套機制叫做mmap。
透過mmap可以把檔案映射到使用者虛擬位址空間,透過這個指標就可以存取檔案。
那檔案怎麼支援mmap呢?答案是要實做mmap這個方法,把上層的mmap請求,
轉換成實際的動作。

那怎麼利用mmap做實體記憶體的應用呢?
AP要利用/dev/mem這支檔案,它可以映射到實際的記憶體。
DRIVER端則要用ioremap把實體記憶體轉換成核心虛擬位址,之後就讀寫這個記憶體指標。

最後簡單圖解如下:
AP->開啟/dev/mem->mmap到實體記憶體位址->AP快樂的存取
DRIVER->module_init時做ioremap->取得記憶體指標->DRIVER快樂的存取

從另一個觀念來看,VMA 可以讓 Linux kernel 以 process 的角度來管理 virtual address space。Process 的 VMA 對映,可以由 /proc/<pid>/maps 檔案查詢

int open(const char *pathname, int flags, mode_t mode)
flags:當檔案打開時,可以做的動作write,read,execute
mode:當檔案建立時,可以對於owner,user,group的權限
參考網址

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
start指定記憶體位置,通常都是用NULL。start anywhere
offset指定檔案要在那裡開始對映,通常都是用0。
protections:權限:PROT_READ,PROT_WRITE,PROT_EXEC,PROT_NONE
flags:MAP_FIXED,MAP_PRIVATE,MAP_SHARED,MAP_ANONYMOUS,MAP_DENYWRITE,MAP_GROWSDOWN 
MAP_LOCKED

------------------------------------------------
munmap關閉記憶體對映。
int msync(const void *start, size_t length, int flags); 
如果開啟記憶體對映是希望寫入檔案中,那麼修改過的記憶體會在一段時間內與檔案稍稍有點不同。如果您希望立即將資料寫入檔案中,可使用msync。 

start為記憶體開始位置,length為長度。 

flags則有三個: 
MS_ASYNC : 請Kernel快將資料寫入。 
MS_SYNC : 在msync結束返回前,將資料寫入。 
MS_INVALIDATE : 讓核心自行決定是否寫入,僅在特殊狀況下使用。 
網址

參考資料:
Linux 的 Virtual Memory Areas(VMA):基本概念介紹
實體記憶體映射技術:mmap ioremap
Linux 的 Virtual Memory Areas(VMA):基本概念介紹-2
小談 mmap() 與 VMA
Linux程式設計-13.記憶體對映mmap

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()