【作業系統2】作業系統啟動過程與異常/中斷,系統呼叫

努力工作的帥呀帥發表於2020-11-28

作業系統啟動過程

作業系統(OS)儲存在硬碟(DISK)上的,然後由BIOS(基本IO處理系統)來提供相應的支援。BIOS的作用是按下電源,計算機開機後能進行功能檢測,做完檢測後才能載入相應的軟體執行。

除了OS外還有一個很簡單的小程式叫Bootlader,Bootlader主要功能用來載入OS,將OS從硬碟載入到記憶體中去。讓CPU可以執行作業系統。Bootlader儲存在硬碟上第一個主引導扇區(512位元組)。

作業系統啟動過程如下

  1. 通電
  2. 通電後,CPU預設從記憶體地址0XFFFF0開始執行指令。這個地址在系統BIOS的地址範圍內,無論是Award BIOS還是AMI BIOS,放在這裡的只是一條跳轉指令,跳到系統BIOS中真正的啟動程式碼處。
  3. BIOS會完成一系列的工作,包括POST(加電自檢),檢查計算機的各種裝置是否能正常工作。
  4. 自檢完畢後,BIOS負責將Bootlader從磁碟的引導扇區載入到記憶體0X07C00處。同時跳轉到CS:IP=0000:7C00處。
  5. 執行Bootlader的程式碼,將作業系統的程式碼和資料從硬碟載入到記憶體中;再跳轉到作業系統的起始地址。執行作業系統的程式碼。

作業系統如何與裝置程式進行互動

作業系統主要通過中斷與系統呼叫和裝置進行互動。通過異常與系統呼叫和應用程式進行互動。

系統呼叫(來源於應用程式):應用程式主動向作業系統發出服務請求。
異常(來源於不良的應用程式):非法指令或其它花的處理狀態(如:記憶體出錯)。
中斷(來源於外設):來自不同的硬體裝置的計時器和網路的中斷(如:)。

為什麼應用程式不能直接訪問硬體而是通過作業系統?

  • 作業系統是可信任的。並且程式直接訪問硬體很容易出問題。
  • 為了方便應用程式。因為作業系統對上可提供統一的介面,這樣就不用因為裝置不同而開發不同的程式。

異常/中斷,系統呼叫的區別

源頭處理時間響應
中斷外設非同步持續,對使用者應用程式是透明的
異常應用程式意想不到的行為同步殺死或者重新執行意想不到的應用程式指令
系統呼叫應用程式請求操作提供服務同步或非同步等待和持續

中斷的非同步:指產生事件時,程式並不知道什麼時候會產生。
異常的同步:指執行到某條指令時一定會產生事件,如除0。
系統呼叫的同步:比如作業系統讀檔案時,發出讀的請求,等讀完資料後才會去做其它事情。
系統呼叫的非同步:作業系統讀檔案時,發出讀的請求後不管是否讀完資料,馬上去做其它事情。

異常/中斷,系統呼叫的處理過程

中斷/異常的處理過程:
中斷/異常的處理過程分為硬體的處理過程和軟體的處理過程。兩者合在一起才能完成一個正常的中斷/異常的處理工作,過程如下:

當中斷/異常發生後,首先需要知道中斷/異常由哪個特定的例程來服務。為此作業系統內部需要建立一張KEY-VALUE的表。表的KEY是中斷/異常的編號。建立表的原因是因為一旦標記好後就能區分出是硬碟中斷還是滑鼠中斷又或者是鍵盤中斷(中斷是外設的事件,異常是CPU的事件)。不同外設產生出來的中斷,它們的編號也不同。每個編號對應的都有一個地址,每個地址對應不同的服務例程,這樣,當一箇中斷/異常產生後,就可以通過查詢表來找到特定的地址。再跳轉到特定的服務例程來處理。

為了讓系統能完成更多的工作,除了上面所說的以外還需要完成更多的事情,因為當一箇中斷產生後,是打斷了當前的正常執行,來處理一個更加緊急的來自外設的一個事件。既然打斷了一個程式的執行,那麼就需要做出一定的保護(儲存與恢復機制),有了這個機制後,作業系統才能做完中斷操作後,讓程式繼續執行。

中斷處理時,硬體需要做的事:

  1. 設定中斷標記(標記設定好,CPU才知道產生了一箇中斷事件,通過中斷標記可以知道中斷編號,把中斷編號發給作業系統,由此可以得知具體的處理例程)

中斷處理時,軟體(作業系統)需要做的事:

  1. 儲存被打斷的執行現場。
  2. 中斷服務程式處理(每個中斷編號對應一個特定的服務例程)。
  3. 服務例程執行完畢,清除中斷標記。
  4. 恢復之前儲存的處理狀態,讓原來程式繼續執行。

異常處理時,需要做的事:

  1. 儲存現場
  2. 異常處理:殺死產生異常的程式,或重新執行異常指令
  3. 恢復現場

系統呼叫:
系統呼叫是指我們的應用程式需要作業系統來提供服務,而這個服務不能由應用程式來直接執行,必須要有作業系統來執行。那麼這個過程就需要有一個介面,而這個介面就被我們稱之為系統呼叫。而有了這個介面後,就可以由我們的作業系統來給應用程式提供各種各樣的服務。

當產生一條系統呼叫時,會有一個從使用者態轉換到核心態的過程
-使用者態:應用程式在執行的過程中,CPU執行的特權級的狀態(很低,不能訪問特殊機器指令和IO)。
-核心態:應用程式在執行的過程中,CPU執行的特權級的狀態(高,作業系統可以執行CPU任何一條指令)。

系統呼叫和函式呼叫的區別:

  1. 因為應用程式和作業系統有各自的堆疊,所以發出一個函式呼叫時,它是在一個棧空間完成引數的傳遞與返回,同時它的整個執行過程都在使用者態。但在系統呼叫的執行過程中,當它切換到核心後,堆疊會進行切換。同時還要完成從使用者態到核心態的轉換。

跨越作業系統邊界的開銷:

  1. 建立中斷/異常/系統呼叫號與對應服務例程對映關係的初始化開銷
  2. 建立核心堆疊(作業系統和應用程式的堆疊不一樣)
  3. 驗證引數(作業系統不信任應用程式傳遞過來的引數,所以會檢查資料)
  4. 核心態對映到使用者態的地址空間,更新頁面對映許可權(記憶體拷貝開銷)
  5. 核心態獨立地址空間TLB

相關文章