Linux的記憶體I O對映

2021-08-28 09:32:33 字數 2607 閱讀 7153

記憶體的i/o對映是將檔案某區域的內容對映到程序的虛擬空間的技術

通過對檔案的記憶體io對映,可使用使用者對檔案的操作轉換為對記憶體的操作,這樣不僅使用方便而且提高了儲存速度。

void *mmap(void *addr, size_t length, int prot, int flags,

int fd, off_t offset);

addr:引數用於指定對映儲存區的起始位址。通常將其設定為0,這表示由系統選擇該對映區的起始位址。此函式的返回值是該對映區的起始位址。

fd:引數是指定要被對映檔案的描述符。在檔案對映到位址空間之前,必須先開啟該檔案。

length:引數是對映的位元組數,

offset:是要對映位元組在檔案中的起始偏移量(有關off值的一些限制將在後面說明),

prot:引數指定了對映儲存區的保護要求,如圖14-25所示。可設定為下面的任意組合

注意:prot的設定不能超過open呼叫的許可權,如open開啟為唯讀,但在這用了可寫,這是不允許的

flags:會影響對映區域的各種特性

map_shared:對對映區域的寫入資料會複製回檔案內,而且允許其他對映該檔案的程序共享。儲存操作立刻修改對映檔案內容

map_private:對對映區域的寫入操作會產生乙個對映檔案的複製,即私人的「寫入時複製」(copy on write)對此區域作的任何修改都不會寫回原來的檔案內容。儲存操作導致建立對映檔案的副本,並對副本讀寫

map_anonymous:建立匿名對映。此時會忽略引數fd,不涉及檔案,而且對映區域無法和其他程序共享。

map_denywrite:只允許對對映區域的寫入操作,其他對檔案直接寫入的操作將會被拒絕。

map_locked:將對映區域鎖定住,這表示該區域不會被置換(swap)。

在呼叫mmap()時必須要指定map_shared 或map_private。

off的值和addr的值(如果指定了map_fixed)通常被要求是系統虛擬儲存頁長度的倍數。

虛擬儲存頁長可用帶引數_sc_pagesize或_sc_page_size的sysconf函式(見2.5.4節)得到。因為off和addr常常指定為0,所以這種要求一般並不重要。

與對映區相關的訊號有sigsegv和sigbus

訊號sigsegv通常用於指示程序試圖訪問對它不可用的儲存區。如果對映儲存區被mmap指定成了唯讀的,那麼程序試圖將資料存入這個對映儲存區的時候,也會產生此訊號。

如果對映區的某個部分在訪問時已不存在,則產生sigbus訊號。例如,假設用檔案長度映**乙個檔案,但在引用該對映區之前,另乙個程序已將該檔案截斷。此時,如果程序試圖訪問對應於該檔案已截去部分的對映區,將會接收到sigbus訊號。

注意:

子程序能通過fork繼承儲存對映區(因為子程序複製父程序位址空間,而儲存對映區是該位址空間中的一部分),

但是由於同樣的原因,新程式則不能通過exec繼承儲存對映區。

int mprotect(void *addr, size_t len, int prot);
prot的合法值與mmap中prot引數的一樣(見圖14-25),請注意,位址引數addr的值必須是,系統頁長的整數倍。

如果修改的頁是通過map shared標誌對映到位址空間的,那麼修改並不會立即寫回到檔案中。相反,何時寫回髒頁由核心的守護程序決定,決定的依據是系統負載和用來限制在系統失敗事件中的資料損失的配置引數。因此,如果只修改了一頁中的乙個位元組,當修改被寫回到檔案中,時,整個頁都會被寫回。

如果共享對映中的頁已修改,那麼可以呼叫msync將該頁沖洗到被對映的檔案中. msync函式類似於fsync (見3.13節),但作用於儲存對映區。

int munmap(void *addr, size_t length);
功能:實現類似命令cp的功能

#include #include #include #include #include #include #include #include #include #include #include #include #include #define copyincr (1024*1024*1024) /* 1 gb */

intmain(int argc, char *argv)

exit(0);

}

I O記憶體資源對映

我們知道缺省外設i o資源是不在linux核心空間中的 如sram或硬體介面暫存器等 若需要訪問該外設i o資源,必須先將其位址對映到核心空間中來,然後才能在核心空間中訪問它。linux核心訪問外設i o記憶體資源的方式有兩種 動態對映 ioremap 和靜態對映 map desc 一 動態對映 i...

記憶體對映I O與埠對映I O的區別

cpu與裝置的控制暫存器和資料緩衝區進行通訊,控制器中暫存器的兩種編址方案 兩種方法工作原理 當cpu想要讀入乙個字的時候,不論是從記憶體中讀入還是從io埠中讀入,它都要將需要的位址放到匯流排的位址線上,然後在匯流排的一條控制線上置起乙個read訊號。還要用到第二條訊號線來表明需要的是io空間還是記...

磁碟IO 快取IO 直接IO 記憶體對映

磁碟io的幾種訪問方式如下 快取io 快取i o又被稱作標準i o,大多數檔案系統的預設i o操作都是快取i o。在linux的快取i o機制中,資料先從磁碟複製到核心空間的緩衝區,然後從核心空間緩衝區複製到應用程式的位址空間。讀操作 作業系統檢查核心的緩衝區有沒有需要的資料,如果已經快取了,那麼就...