2013-11-01 26 views
0

是否有可能獲得大頁面和連續正常頁面。是否有可能獲得大頁面和連續正常頁面

即時通訊編寫一個運行時,我想創建一個單一的4K保護頁2M堆棧。它需要擴展爲10個進程,每個進程都有10個線程。

考慮到由於TLB未命中而使用2兆頁面,這通常不是C/C++的問題,但通過區域分析,我們將在堆棧上有更多數據(整個區域),因此它不僅僅是熱點的最後一頁。

+0

不知道爲什麼它關閉了一個完全合法的問題,也可能是不尋常的,但我有好我現在增加的原因。 – user1496062

回答

1

說起用於Linux,這當然是可能的,本身分配一個大的頁面,接着一個小區域通常分配:

mmap(base, 1 << 21, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED, -1, 0); 
mmap(base + (1 << 21), 1 << 12, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 

但是,我很難想到有什麼辦法讓內核爲你正確管理地址,這樣你就可以自動爲你分配地址,同時發現一個地址後面有一個有保證的空閒頁面,所以你可能不得不手動分配地址。

編輯:其實,我將不得不修改該聲明;有一個相當簡單的方法來獲得這個保證,至少只要你沒有運行多個可以同時分配的線程。剛分配兩個大頁,取消分配後,在空間的分配小頁,現在是免費的:

p = mmap(NULL, 2 << 21, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); 
mremap(p, 2 << 21, 1 << 21, 0); 
mmap(p + (1 << 21), 1 << 12, PROT_X, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); 
+0

如何使用虛擬地址? – user1496062

+1

我不明白你在問什麼。當然,所有這些地址都是虛擬的。內核通常不會讓你處理物理地址。 – Dolda2000

+0

感謝您的更新。只需請求一個大頁面和一個普通頁面,並通過自定義虛擬地址重新映射爲連續。 – user1496062

相關問題