Linux系統程式設計 記憶體對映 mmap

2021-10-02 14:02:22 字數 1938 閱讀 4912

mmap()系統呼叫在呼叫程序的虛擬位址空間中建立乙個新記憶體對映。對映分為兩種。

-檔案對映:檔案對映將乙個檔案的一部分直接對映到呼叫程序的虛擬記憶體中。一旦乙個檔案被對映之後就可以通過在相應的記憶體區域中操作位元組來訪問檔案內容了。對映的分頁會在需要的時候從檔案中(自動)載入。

-匿名對映:乙個匿名對映沒有對應的檔案。相反,這種對映的分頁會被初始化為0。(乙個內容總是被初始化為0的虛擬檔案的對映)

乙個程序的對映中的記憶體可以與其他程序中的對映共享(即各個程序的頁表條目指向ram中相同分頁)(fork())。

當多個程序共享相同記憶體分頁時,每個程序可能會看到其他程序對分頁內容做出的改變,這取決於對映是私有還是共享的。

-私有對映(map_private):對對映的改變其他程序不可見,變更將不會在底層檔案上進行。核心使用寫時複製技術,當程序試圖修改內容時,建立乙個新的分頁。

-共享對映(map_shared):變更對所有共享程序可見,發生在底層檔案上。

#include

void

*mmap

(void

*addr,size_t length,

int prot,

int flags,

int fd,off_t offset)

;

addr引數制定了對映被放置的虛擬位址。如果將addr設為null,那麼核心將會為對映選擇乙個合適的位址。這是建立對映的首選方法。

成功時會返回新對映的起始位址。發生錯誤時返回map_failed。

lenth引數指定了對映的位元組數。lenth會被核心提公升為分頁大小的下乙個倍數。

prot引數是乙個位掩碼,指定了施加於應設定上的保護資訊,其取值是prot_none(區域無法訪問)或者為下列三者組合(or)值描述

prot_read

區域內容可讀

prot_write

區域內容可寫

prot_exec

區域內容可執行

flags引數為map_private或map_shared

fd,offset是用於檔案對映的(匿名對映忽略)。fd是乙個標識被對映的檔案的檔案描述符。offset指定了對映在檔案中的起點,必須是系統分頁大小的倍數。

int

main

(int argc,

char

*ar**)

關於記憶體保護

如果乙個程序在訪問乙個記憶體區域違反了該區域的保護位(prot),那麼核心將會向該程序傳送乙個sigse**訊號。

記憶體保護資訊在程序私有的虛擬記憶體表中。因此,不同程序可能會有不同的保護位來對映同乙個記憶體區域。

#include

intmunmap

(void

*addr,size_t length)

;

addr引數是待解除對映的位址範圍的起始位址,必須與乙個分頁邊界對齊。

length引數是乙個非負整數,它指定了待解除對映區域的大小(位元組數)。

當乙個程序最終或執行了乙個exec()之後程序所有的對映會自動解除。

為確保乙個共享檔案對映的內容會被寫入底層檔案中,在使用munmap()解除乙個對映之前需要呼叫msync().

複製檔案

open中flag要和mmap中一致 不然會mmap失敗

#include

#include

#include

#include

#include

intmain

(int argc,

char

*ar**)

Linux系統程式設計之 mmap對映

共享記憶體 了解mmap 函式的使用 例項 include include include include include int main 拷貝資料 strcpy mem,hell0 釋放對映區 mummap mem,8 close fd 輸出 mem.txt檔案包含hello 如果char me...

linux系統程式設計 記憶體對映區概念及相應函式

引數 含義name posix ipc名字,格式為 somename oflag 標誌mode 許可權標誌 作用o creat 沒有該物件則建立 o excl 如果o creat指定,但name不存在,就返回錯誤 o nonblock 以非阻塞方式開啟訊息佇列 o rdonly 唯讀o rdwr 讀...

Linux系統程式設計之程序間通訊二 記憶體對映區

fd 要對映的檔案的fd。通過open 函式得到 offset 對映的時候檔案指標的偏移量 返回值int munmap void addr,size t length 通過在記憶體中建立檔案的對映區實現兩個程序間通過該對映區通訊 a程序寫b程序讀,當a程序寫的東西比較多時可能會出現a沒寫完,b已經讀...