利用異常表處理Linux核心態缺頁異常(轉)

BSDLite發表於2007-08-16
利用異常表處理Linux核心態缺頁異常(轉)[@more@]  前言

  在程式的執行過程中,因為遇到某種障礙而使 CPU 無法最終訪問到相應的實體記憶體單元,即無法完成從虛擬地址到實體地址對映的時候,CPU 會產生一次缺頁異常,從而進行相應的缺頁異常處理。基於 CPU 的這一特性,Linux 採用了請求調頁(Demand Paging)和寫時複製(Copy On Write)的技術

  1. 請求調頁是一種動態記憶體分配技術,它把頁框的分配推遲到不能再推遲為止。這種技術的動機是:程式開始執行的時候並不訪問地址空間中的全部內容。事實上,有一部分地址也許永遠也不會被程式所使用。程式的區域性性原理也保證了在程式執行的每個階段,真正使用的程式頁只有一小部分,對於臨時用不到的頁,其所在的頁框可以由其它程式使用。因此,請求分頁技術增加了系統中的空閒頁框的平均數,使記憶體得到了很好的利用。從另外一個角度來看,在不改變記憶體大小的情況下,請求分頁能夠提高系統的吞吐量。當程式要訪問的頁不在記憶體中的時候,就透過缺頁異常處理將所需頁調入記憶體中。

  2. 寫時複製主要應用於系統呼叫fork,父子程式以只讀方式共享頁框,當其中之一要修改頁框時,核心才透過缺頁異常處理程式分配一個新的頁框,並將頁框標記為可寫。這種處理方式能夠較大的提高系統的效能,這和Linux建立程式的操作過程有一定的關係。在一般情況下,子程式被建立以後會馬上透過系統呼叫execve將一個可執行程式的映象裝載進記憶體中,此時會重新分配子程式的頁框。那麼,如果fork的時候就對頁框進行復制的話,顯然是很不合適的。

  在上述的兩種情況下出現缺頁異常,程式執行於使用者態,異常處理程式可以讓程式從出現異常的指令處恢復執行,使使用者感覺不到異常的發生。當然,也會有異常無法正常恢復的情況,這時,異常處理程式會進行一些善後的工作,並結束該程式。也就是說,執行在使用者態的程式如果出現缺頁異常,不會對作業系統核心的穩定性造成影響。那麼對於執行在核心態的程式如果發生了無法正常恢復的缺頁異常,應該如何處理呢?是否會導致系統的崩潰呢?是否能夠解決好核心態缺頁異常對於作業系統核心的穩定性來說會產生很大的影響,如果一個誤操作就會造成系統的Oops,這對於使用者來說顯然是不能容忍的。本文正是針對這個問題,介紹了一種Linux核心中所採取的解決方法。

  在讀者繼續往下閱讀之前,有一點需要先說明一下,本文示例中所選的程式碼取自於Linux-2.4.0,編譯環境是gcc-2.96,objdump的版本是2.11.93.0.2,具體的版本資訊可以透過以下的命令進行查詢:
CODE:
  $ gcc -v
  Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
  gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
  $ objdump -v
  GNU objdump 2.11.93.0.2 20020207
  Copyright 2002 Free Software Foundation, Inc.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-962062/,如需轉載,請註明出處,否則將追究法律責任。

利用異常表處理Linux核心態缺頁異常(轉)
請登入後發表評論 登入
全部評論

相關文章