2012-09-22 23 views
1

我創建使用mmap匿名映射,12個字節(小我知道)我如何知道我的mmaped分配的範圍?

p = mmap(NULL, 
     12, 
     PROT_READ| PROT_WRITE, 
     MAP_ANONYMOUS | MAP_PRIVATE, 
     -1, 
     0); 

然後我想驗證我是否可以寫超出了12個字節

p=p+13; 
strcpy(p,str); 
printf("String at p is %s\n", ((char *)p)); 

果然我可以讀寫這個地區。我嘗試通過將指針遞增20,000來跨越~5頁。我的系統上的頁面大小是4096.我使用sysconf(_SC_PAGESIZE)發現了這個問題。我仍然可以讀寫指針

怎麼回事?我做錯了什麼,或者我還沒有達到一些glibc限制嗎?

編輯:爲了驗證,我想我的代碼失敗,超越穿越一些限制,我無法實現的,其中該限制是

回答

1

對於小的增量,你只是看到的事實是神器虛擬內存按頁面組織。頁面大小是可分配給進程的最小內存增量。

對於較大的增量,您可能正在運行一個分配給其他用途的頁面,例如堆,堆棧或某個其他文件的映射。

+0

不應該大增量失敗,在這種情況下?具體而言,我試圖瞭解何時我可以在超出某些界限的情況下閱讀或寫作。在我的情況下,即使5頁也沒有達到界限,當我要求的是12個字節! – wrecktangle

+0

假設你的堆使用地址10,000到50,000,並且mmap在地址6,000處分配一個塊。當你添加20,000到mmap地址時,那是26,000,它位於堆的中間。你不能依賴它永遠失敗,沒有理由爲什麼系統不能爲了不同的目的分配相鄰的地址頁面,而你只是從一個溢出到另一個。 – Barmar

+0

有趣。因此,我認爲自己能夠行使良好的行爲,還是有時候glibc會抱怨? – wrecktangle

相關問題