mmap @ user space

參考:Linux程式設計-13.記憶體對映mmap 或 GNU libc manual 13.7 Memory-mapped I/O
mmap() 將檔案當成記憶體使用,將 file 從 offset 開始、長度 length 的區塊映射到 user virtual memory 供存取。

#include
void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
int munmap(void *start, size_t length);

  • start:user 想要的位置,通常可不指定
  • prot: protection mode (read/write/exec/none)
  • flags:
    • MAP_PRIVATE: 另外取得自用的記憶體區塊,寫入只寫到自用的記憶體區塊,不會寫回檔案。
    • MAP_SHARED: 使用共用的記憶體區塊得以立即共用包括修改的部份,會寫回檔案,但可能不會立即寫回。
    • MAP_FIXED: mapped exactly at ADDR (must be page-aligned), otherwise a convenient nearby address is used.
    • ...
int msync(const void *start, size_t length, int flags);
立即寫回檔案

參考:Zero Copy I: User-Mode Perspective
在某些情況下,mmap() 可以取代 read() 減少一次將資料複製到 user space 的動作。

參考:mmap Sample Code
實體記憶體也是檔案 /dev/mem,mmap() 可以讓 user space 存取實體記憶體,例如週邊的 registers,如此便可以在 user space 設定週邊。但在 user space 要將資料寫到 kernel space 會花些時間。

延伸閱讀

  1. 在驅動程式,ioremap 將 physical address 映射到 virtual address。
  2. remap_page_range():待研究

0 意見: