2017-03-16 51 views
0

我正在開發一個簡單的操作系統,只是爲了更好地瞭解它的內部。在開發Boot loader和在16-bit Real Mode上運行的簡單內核時,我遇到了陌生術語System Call和熟悉的Interrupt系統調用和中斷的執行有何不同?

我一直在谷歌搜索的條款,因爲只發現概念仍然不清楚給我。據我所知,在least privileged mode中運行的應用程序使用系統調用來請求運行在Higher Privileged mode(Ring 0)中運行的內核的服務。

我還不清楚系統調用是如何實現的。

說,我正在寫一個簡單的C程序到print a word並編譯它。現在,我剩下一個可執行文件,其中包含系統調用以在屏幕上打印給定的單詞。是對應於給定的情況下我的問題如下:

問題1:

一旦執行該程序時,系統調用通知請求的內核 - 到底發生在這裏的低層次方面編程嗎?

問題2:

中斷可以是系統呼叫時,反之亦然?


如果看起來我沒有清楚地理解概念,請向我解釋系統調用的概念。


感謝你。

+2

注意,你不必在實模式特權級別。系統調用是調用操作系統的通用術語。中斷可以用來執行一個系統調用,但x86也有專門的指令('syscall','sysenter')。 – Jester

+0

這是否意味着系統調用和中斷是相同的? –

+1

不,他們不一樣。中斷可以用來實現系統調用,但這不是他們的主要目的。 – Jester

回答

1

在大多數系統上,中斷和系統調用(以及異常處理程序)都以相同的方式實現。

程序一執行,系統調用就會通知內核請求 - 在低級編程方面究竟發生了什麼?

通常,系統調用是圍繞彙編語言例程的包裝。事件的順序是:

  1. 電話系統例行
  2. 系統例行解包參數並加載它們到寄存器中。
  3. 系統例程通過執行更改模式指令(某些高於用戶模式的模式)強制執行異常(由數字標識)。
  4. CPU通過調度到系統調度表中的異常處理程序來處理異常。
  5. 處理程序執行系統服務。
  6. 處理程序執行異常或中斷指令的返回,將進程返回到用戶模式(或從中調用任何模式)並返回到系統服務例程。
  7. 系統服務程序解開寄存器的返回值並更新參數。
  8. 返回到調用函數。

中斷可以是系統調用嗎?反之亦然?

號,他們被分派以同樣的方式。

想必操作系統可以系統調用和中斷映射到相同的處理,但是這將是扭曲。

1

系統調用像函數調用操作系統,執行不能或不宜通過手動的程序處理,並倒在操作系統的任務範圍內操作,例如文件操作,寫篩選等

x86的處理由某種回調機制處理中斷。各種外部中斷都有一箇中斷號。操作系統設置一個表(中斷向量表處於實模式,中斷描述符表處於保護模式),它存儲指向處理相應中斷的函數的指針。例如,如果在接收到來自中斷控制器的中斷時按下按鍵中斷將被分配給int 21h,則CPU存儲當前代碼段,指令指針,標誌和堆棧,然後CPU將檢查中斷表中的條目21h並讀取取出指令處理程序所在的地址。然後執行處理程序並恢復正常執行。

但是,在中斷表中調用處理程序的這種行爲不僅可以由真實硬件中斷觸發,還可以由內部異常(如除以零,達到未定義的操作碼等)觸發。異常被分配給與硬件中斷有所不同的中斷號。

最後任何中斷,也可直接通過「INT N」指示當前執行的程序觸發。

這最後一個功能通常用於系統調用。原因在於用戶程序只需要知道中斷號(通常是標準化的(DOS主要使用21h,Linux主要是80h),操作系統可以將中斷處理程序放在任何它喜歡的地方,並將其地址存儲在對應的中斷表項

請記住,還有其他的方式來實現系統調用,例如在保護模式下,x86提供的調用門是特殊的段,如果你試圖把它們加載到CS使用遠程調用。新的處理器提供了特殊的系統調用的指令更快他們中斷