2013-11-20 29 views
6

在mmap()的手冊頁:爲什麼文件中MMAP啓動時偏移()必須是多頁面大小的

它的原型是:

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

和說明:

The mmap() function asks to map 'length' bytes starting at offset 'offset' 
from the file (or other object) specified by the file descriptor fd into 
memory, preferably at address 'start'. 

Sepcifically ,最後一個參數:

'offset' should be a multiple of the page size as returned by getpagesize(2). 

從我的練習中,offset必須是頁面大小的倍數,例如我的Linux上的4096,否則,mmap()將返回Invalid argument,offset用於文件偏移,爲什麼它必須是虛擬內存系統頁面大小的倍數?

謝謝,

回答

4

簡單的答案:使其快速。更復雜的答案是:無論何時在映射內存中的某個位置訪問內存時,操作系統都必須確保該位置填充了文件的內容。但操作系統只能檢測您是否訪問內存頁 - 而不是單個位置。它的功能是在文件和內存頁面的偏移量之間創建一個簡單的關係,並且每當訪問內存頁面時,都會加載文件的該部分。爲了快速進行這些計算,它會限制您從某些偏移開始。

+1

「操作系統必須確保這個位置充滿文件的內容,但操作系統只能檢測您是否訪問內存頁面 - 而不是單個位置。」你能在這裏更簡單明瞭嗎?無法吸收。謝謝! –

+0

@GauravMinocha操作系統只能檢測到整個頁面正在被讀取(在本例中爲4096字節),而不是單個字節地址(RAM中的每個單字節內存都可以被尋址)。因此,文件的整個頁面一次加載。 – jwbensley

-2

所有進程的內存都是虛擬的。
「虛擬內存」是映射到物理RAM的硬盤上的空間。

在硬盤上,數據存儲在稱爲 磁道的薄同心圓段中。

操作系統要求以線性連續的方式查看空間。
HDD製造商在整個90年代都採用了這種模式。

HDD上最小的可分配單元是一個扇區, 它是512字節大......半千字節。

從操作系統的角度來看,Windows上的NTFS爲HDD上最小的可分配單元提供了4096字節的默認值。

這將是一個由四個扇區組成的羣集......一個頁面的大小。

來源:http://ntfs.com/hard-disk-basics.htm

一個頁面通常是4096個字節大,因爲英特爾的x86 MMU地圖數據存儲...

通過一系列的表格,二要準確。它們是分頁 目錄和分頁表。兩個表都包含1024 4byte 條目,使它們每個4kb。

在頁表中,每個條目指向的物理地址是 ,然後映射到通過計算目錄內的偏移量 和表內的偏移量找到的虛擬地址。

請注意,這意味着頁面可以比4096更大,
但它是最小可能的單元尺寸爲MMU!

來源:http://wiki.osdev.org/Paging#MMU

結論:
大小由那些誰編程/設計的操作系統確定。它可以是4096字節的任何倍數。

相關問題