天天看點

linux頁表問題

1.核心頁表問題 

kmalloc與kmem_cache_alloc之後的頁表 

實際上前者是後者實作的,而且實體位址連續核心在執行kmalloc的時候,并沒有發現有設定頁表的行為,實際上是在系統啟動的時候在 kernel_physical_mapping_init裡面設定好的,3g到3g+896m的地方屬于實體影射,和實體位址是一一對應的,是以可以直 接使用,但是既然實體映射是一一對應的而且擁有頁表,那麼豈不是任何通路核心實體映射的代碼都不會缺頁,是這樣的,這不會有任何問題,刑不上大夫,你既然能到核心空間,就證明你已經擁有了一定的特權,隻要符合約定就不會出問題, 

就比如說誰也沒有規定你不能在中斷處理裡面調用schedule,而且 你完全可以在沒有調用spin_lock的情況下調spin_unlock,會出問題嗎?出問題的是你自己,這個世界不會因為刀可以殺人就不用刀切菜了。啟動之後,任何kmalloc或kmem_cache_alloc的調用都從夥伴系統把頁拉出來,頁表已經設定好了。 

vmalloc後的頁表 

這個配置設定函數頁後,必須顯式地更新頁表,因為vmalloc配置設定的頁面不屬于實體映射,而是屬于3g+896m後的vmalloc區域的映射區域,在vmalloc後必須set_pte而vfree後必須清除頁表。 

但是問題來了,在vmalloc後雖然設定了vmalloc的頁表,但是并沒有清除原來的頁表(為了使得讨論友善我這裡故意假設vmalloc在 3g+896以下配置設定),也就是兩個頁表對應同一個頁面(實體映射和vmalloc映射),事實上是這樣的,但是雖然理論上是這樣,但實際上又沒有意義 呢?實際上沒有意義,我們知道,通路一個位址是因為我們需要它,很多情況下這個位址是一個資料結構,而包括資料結構在内的所有記憶體都來自夥伴系統,如果一個位址已經被實體位址映射了,說明它已經不在夥伴系統空閑連結清單裡面了,那麼同樣來自夥伴空閑頁鍊的vmalloc還會得到相同的頁面嗎?原則上你完全可以并行通路這兩個虛拟位址,但事實上這将是一種自虐行為。 

2.使用者頁表問題 

使用者頁表問題是簡單的,比如在mmap系統調用裡面,修改的隻是一些vm區域的字段,比如start,end之類的,真正的頁表設定将推遲到缺頁的發生。但是在umap時必須清除頁表。 

事情真的就是這樣嗎?事實上就是這樣,但是要注意的是,這個時候最少兩個地方映射着使用者的實體記憶體,一個是使用者空間,一個是初始化時候的實體映射。 

綜上,真正修改頁表就在那麼幾個點,分别為:系統啟動,使用者缺頁,vmalloc,仔細看一下do_pagefault的代碼,涉及核心缺頁,就是vmalloc導緻的,這涉及到另一個問題,就是init_mm的懶惰更新。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274052

繼續閱讀