2006-05-06

page fault in kernel ?!

page fault in kernel ?!This entry was originally published at 抓~ 抓到一隻瞌睡蟲

以前完全不知道page fault是什麼, 等到真的碰上了才會覺得它的厲害.

星期四晚上debug課上到最後, share了一個bug. 其實也不能算是bug, 畢竟這個問題應該要歸類在paging 101裡面, 只是我沒有注意到.

OS課本上面當然 有詳細的paging機制, 我們也都知道page table就在記憶體裡面, 但是既然開了paging, 那就表示processor看到的所有address都會先給MMU轉過(要是你有MMU, for x86, 那就是有了), 也就是說, 既然你需要存取page table, 那麼你就要讓page table被page起來. 重點就是在那個所有CPU看的address, 都必須要page present才有意義.

當然在kernel剛開起來, 最好不要讓它page fault, 這樣比較麻煩一點, 所以簡單一點的方法就是一開始就讓kernel的部份整個都做好page, 那樣在你有任何user process之前(或說你要去allocate新的空間之前)你都不應該碰上page fault.

結果我弄出了一些問題, 不過解決了. 解決的方法…
1. page directory必須放在4K align的地方(如果你用4K page)
2. page table必須放在4K align的地方(同上)
2. kernel code建議放在4k align的地方(同上)

UPDATED:
當天晚上share完這個bug之後, 我回寢室又改呀改, 竟然在kernel space遇上了page fault… 嘖…

沒有留言: