2010-05-12 34 views
1

我對訪問一些無效數據存在疑問。操作系統如何導致這種情況的分段錯誤:內核如何給seg。這樣的情況下的錯誤?

假設一塊數據長度爲100個字節,並在4K頁面的開頭對齊。如果我們訪問頁面前100個字節內的有效數據,這將把頁面加載到內存中,並將頁表項放入TLB中。如果我們現在嘗試訪問100和4K之間的一些無效數據,由於條目已經存在於頁表中,我們是否會被允許訪問無效數據?

回答

5

這是正確的。但通常你不直接從操作中分配內存。您通常通過一些庫函數(newmalloc等)分配它。庫函數將採用4KB(通常它也會在一個塊中分配4KB以上),並將其分解爲您要求的實際塊。所以通常當你要求100個字節的內存時,100個字節將在你做出的兩個其他分配請求之間「楔入」。

這就是爲什麼它是「未定義的行爲」,當你訪問的數據從一個數組的結尾:你可能得到一個分段錯誤,你威力垃圾恰好是存儲在那裏一些其他的變量,或者你可能沒問題,它實際上可以工作(至少在一段時間內)。

2

整個頁面屬於您的程序,因此不會產生分段錯誤或訪問衝突。出於這個原因,內存調試工具(如Electric Fence)可以選擇性地響應分配請求,並在頁面的最後部分使用一塊內存,而不是開始,這樣超出界限的錯誤就會導致分段錯誤。

2

即使頁面未加載,您實際上也可以訪問頁面的字節100和4K之間的無效數據。內核只知道對不存在的頁面(或者沒有讀/寫權限的頁面)進行的訪問。頁面中特定數據塊的確切位置由C庫確定,而不是由內核確定。

如果你想要一個無效的內存訪問在調試時立即失敗,你應該使用像valgrind這樣的工具來檢查所有的內存訪問。這仍然不能保證你會報告錯誤。你可能會發現你實際上正在訪問一段被分配用於其他目的的內存,在這種情況下,valgrind無法知道它是錯誤的。

相關問題