轉:
http://blog.csdn.net/yanyiyyy/article/details/6532030
Linux中內存的管理和分配
Linux的頁目錄表和頁表是在程序head.s中設置的.head.s程序在物理地址0處存放了一個頁目錄表,緊隨其後的是4個頁表.
page.s程序用於實現頁異常中斷處理過程,其中缺頁和頁寫保護引起的中斷分別調用memory.c的do_no_page()和do_wp_page()函數進行處理.do_no_page()會把需要的頁面從塊設備中取到內存指定位置處.在共享內存頁面的情況下,do_wp_page()會複製被寫的頁面,同時取消頁面的共享.
寫時複製機制
爲了節約物理內存,在調用fork()生成新進程時,新進程與原進程會共享同一內存區.只有當其中一進程進行寫操作時,系統纔會爲其另外分配內存頁面.這就是寫時複製機制(copy on write)的意思.
當進程A使用系統調用fork創建一個子進程B時,由於子進程B實際上是父進程A的一個拷貝,因此會擁有與父進程相同的物理頁面.爲了節約內存和加快創建速度的目標,fork()函數會讓子進程B以只讀方式共享父進程A的物理頁面.同時將父進程A對這些物理頁面的訪問權限也設成只讀.這樣,當父進程A或子進程B任何一方對這些已共享的物理頁面執行寫操作時,都會產生頁面出錯異常(page_fault int14)中斷,此時CPU會執行系統提供的異常處理函數do_wp_page()來解決這個異常.
do_wp_page()會對這塊導致寫入異常中斷的物理頁面進行取消共享操作,爲寫進程複製一新的物理頁面,使父進程A和子進程B各自擁有一塊內容相同的物理頁面.最後,從異常處理函數中返回時,CPU就會重新執行剛纔導致異常的寫入操作指令,使進程繼續執行下去.