2017-10-13 50 views
0

在Linux中,mmap可用於在進程的虛擬地址空間中創建映射。它的一個用例是處理非常大的文件。不幸的是,它只能創建一個已經連續開始的映射:它只接受一個offsetlength如何在用戶空間中創建分段內存映射?

我正在尋找解決方案將內存中的幾個段映射到一個連續的地址範圍。這個用戶可能是在用戶空間運行的NTFS驅動程序,該用戶空間想要爲實際上在磁盤上碎片化的文件提供連續的地址範圍。在我的理解中,對於在內核中運行的驅動程序,這是可能的,但我特別在用戶空間中尋找解決方案。

該解決方案應該是C/C++。我對內核版本沒有要求。到目前爲止,我可以提出的最佳方法是編寫一個知道如何從段跳轉到段的迭代器,但我也希望與僅接受字符數組的庫進行接口。

我希望這讓我的問題。歡迎任何建議!

回答

1

不幸的是,它只能創造的東西的映射,這是已經連續入手:它接受只有一個offsetlength

它只接受一個offsetlength的時間,你可以調用不止一次mmap更多。

man 2 mmap,注意addr說法:

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

開始通過創建一個大的映射(也許/dev/zero,也許)。然後,重新映射該映射的某些部分。要重新映射,請將起始地址傳遞到addr並使用MAP_FIXED

+0

感謝您的快速響應。手冊頁顯示「MAP_FIXED - 不要將addr解釋爲提示:將映射放在該地址,_addr必須是頁面大小的倍數。」。所以看起來你不能自由地粘貼你想要的任何地址。或者一旦創建了最初的mmap,這不再適用? – delins

+0

@delins:請注意'offset'也必須是頁面大小的倍數。基本上,一切都必須是頁面大小的倍數。這反映了處理器上的MMU如何工作。所以'mmap'可以讓你把地址粘在一起,但是你想......只要這些地址是頁面大小的倍數。 –

+0

這很不幸。單獨的段可以具有任何大小,包括小於頁面大小(理論最小值1字節)。不管! – delins

相關問題