mmap概念
存儲映射 I/O這種高級 I/O方式,它的一個非常經(jīng)典的使用場景便是用在 Framebuffer 應用編程中。通過 mmap()將顯示器的顯示緩沖區(qū)(顯存)映射到進程的地址空間中,這樣應用程序便可直接對顯示緩沖區(qū)進行讀寫操作。
為什么這里需要使用存儲映射 I/O 這種方式呢?其實使用普通的 I/O 方式(譬如直接 read、write)也是可以的,只是,當數(shù)據(jù)量比較大時,普通 I/O 方式效率較低。假設某一顯示器的分辨率為 1920 * 1080,像素格式為ARGB8888,針對該顯示器,刷一幀圖像的數(shù)據(jù)量為 1920 x 1080 x 32 / 8 = 8294400 個字節(jié)(約等于 8MB),這還只是一幀的圖像數(shù)據(jù),而對于顯示器來說,顯示的圖像往往是動態(tài)改變的,意味著圖像數(shù)據(jù)會被不斷更新。
在這種情況下,數(shù)據(jù)量是比較龐大的,使用普通 I/O 方式必然導致效率低下,所以才會采用存儲映射I/O 方式。
用法
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
下面介紹一下 mmap 函數(shù)的各個參數(shù)作用:
addr:指定映射的虛擬內(nèi)存地址,可以設置為 NULL,讓 Linux 內(nèi)核自動選擇合適的虛擬內(nèi)存地址。
length:映射的長度;
prot:映射內(nèi)存的保護模式,可選值如下:
PROT_EXEC:可以被執(zhí)行;
PROT_READ:可以被讀??;
PROT_WRITE:可以被寫入;
PROT_NONE:不可訪問;
flags:指定映射的類型,常用的可選值如下:
MAP_FIXED:使用指定的起始虛擬內(nèi)存地址進行映射;
MAP_SHARED:與其它所有映射到這個文件的進程共享映射空間(可實現(xiàn)共享內(nèi)存);
MAP_PRIVATE:建立一個寫時復制(Copy on Write)的私有映射空間;
MAP_LOCKED:鎖定映射區(qū)的頁面,從而防止頁面被交換出內(nèi)存;
…
fd:進行映射的文件句柄;
offset:文件偏移量(從文件的何處開始映射);