作業系統 – 中斷、系統呼叫、保護與安全

最後更新於 2021 年 10 月 17 日

大雜燴。

在說中斷之前先提一下計算機系統是如何運作的。

計算機系統的運作

I/O 和 CPU 經由公用 Bus (匯流排) 存取共用 Memory。

系統的運作 作業系統 – 中斷、系統呼叫、保護與安全
  • I/O 和 CPU 可以同時在運作
  • 每個 I/O device 都有一個 controller 在負責控制,同時擁有 local buffer
  • device controller 需要專屬軟體來指揮它們,這些軟體叫做驅動程式 (device driver)
    • 驅動程式對 controller 下命令指揮它們完成輸出入工作
    • OS 透過 driver 來控制與指揮 device controller 對週邊設備做實際的 I/O 動作
  • CPU 從 memory 裡拿出資料放到 local buffer 或從 local buffer 拿出資料放到 memory 裡
  • device controller 利用中斷 (inperrupt) 來通知 CPU,他做好 I/O 了

I/O 做完要怎麼通知 CPU?

  • Polling

用一個 while loop 一直詢問 device controller 做完了沒有
非常浪費時間

  • Interrupt

優點:不用 polling,很浪費時間
缺點:要額外的軟體、硬體來做 Interrupt

Interrupt

中斷是指處理器接收到來自硬體或軟體的訊號,提示發生了某個事件,應該被注意,這種情況就稱為中斷。

image 19 作業系統 – 中斷、系統呼叫、保護與安全

在O.S. Area內會存在:

  • 中斷向量表 (Interrupt Vector)
  • 一組中斷服務程式 (Interrupt Service Routine; ISR)

Interrupt 處理流程

  1. OS取得CPU控制權,暫停當前Process執行並保存此Process的當前執行狀況。
    • 執行 Context Switch 來儲存
    • OS藉由儲存暫存器和程式計數器來保存CPU的狀態
  2. OS根據Iterrupt ID查詢Interrupt Vector(中斷向量)並取得ISR(Interrupt Service Routine)起始位址。
  3. Jump to 相對應的ISR之起始位址,系統執行ISR。
  4. ISR執行完畢,將控制權交回給OS。
  5. Resume原先中斷前的Process之執行 (原則上)。

Interrupt種類

有幾種常見的分法:

內外分法

  • 外部中斷(External Interrupt)

CPU以外的週邊設備所引發。
e.g. Machine Check, I/O Complete, Device Error

  • 內部中斷(Internal Interrupt)

不合法的用法所引起的,由CPU本身所引發。
e.g. 執行到 illegal Instruction、Divide-by-zero、overflow

  • 軟體中斷(Software Interrupt)

當User Process於執行過程中,若需要O.S.提供服務時, 則User Process會發出此中斷(System Call)通知O.S.,提供所指定的Service。

Interrupt & Trap 分法

  • Interrupt

硬體產生的中斷。
eg. I/O Complete, I/O error, machine check, Time out

OQUV5zz 作業系統 – 中斷、系統呼叫、保護與安全
  • Trap(Exception)

軟體產生的中斷。
User Process需要O.S.提供時會發出。
e.g. divide-by-zero、invalid memory access、illegal instruction、User 發出請求

n52WUvQ 作業系統 – 中斷、系統呼叫、保護與安全

優先權分法

  • Maskable Interrupt

不急的。

eg. Software Interrupt

  • Non-maskable Interrupt

必須立刻處理的。

eg. Internal Interrupt, I/O error

Interrupt Timeline

CPU 與 I/O 可同時進行,CPU 啟動 I/O 動作,I/O 完成後會發出中斷給 CPU。

Interrupt timeline 作業系統 – 中斷、系統呼叫、保護與安全

同步Interrupt與非同步Interrupt

  • 同步Interrupt

當同步中斷發生時CPU 必須立即處理,又稱作Enable 或Unmask Interrupt(不可遮罩式中斷)。
硬體有關的中斷。

  • 非同步Interrupt

當非同步中斷發生時,CPU 可以忽略延遲非同步中斷的處理,又稱作Disable 或Mask Interrupt(可遮罩式中斷)。
軟體有關的中斷

系統呼叫(System Call)

  • O.S.與User program之間的溝通介面。
  • 通常使用高階語言讀寫,如C或C++。
  • 當user program執行時需要用到O.S.提供的服務則透過發出System Call通知O.S. 由O.S.執行相對應的Service Routine以完成其要求的服務。
  • System Call會伴隨一個Trap,以從User mode轉變為Kernel mode。
  • 通常是用higl-level的API而不是直接使用System call。
    • 把程序簡單化,並且保持可移植性(Program Portability),這樣在不同系統才能運行
      • 因為 system call 是用組合語言寫的
    • System call只能單一呼叫,若要執行很多次System call會非常影響效能,因此將這些system call集合成API
  • win32 API: windows
    • POSIX API: Linux, UNIX, Mac OS X
    • Java API: Java virtual machine(JVM)

系統呼叫類型

  • 行程控制:abort, create, terminate process, allocate/free memory
  • 檔案管理:create, delete, open, close file
  • 裝置管理:read, write, reposition device
  • 維護重要資訊:時間
  • 溝通:send receive message

系統呼叫流程

  1. 在使用者程式中呼叫 system call
  2. 藉由一個軟體中斷 trap (svc #0) 進入 kernel mode,此時系統會將 mode bit 由 user mode 改成 kernel mode (1 -> 0)
  3. 查詢 system call table 來找尋對應的 trap service routine
  4. 當執行完 trap service routine 後發出中斷通知 OS 已經完成

參數傳遞(Parameter passing)

OS通常利用以下三種方式來傳遞參數:

暫存器(Register)

image 6 作業系統 – 中斷、系統呼叫、保護與安全
  • 優:最簡單、快速(不用做記憶體的存取)
  • 缺:暫存器數目有限,參數不能太多。

Block或Table

把參數存在Memory裡,然後將表的起始位址存在一個Register裡後將此Register傳遞給OS。

image 7 作業系統 – 中斷、系統呼叫、保護與安全
  • 優:不限制傳遞參數的數量或長度
  • 缺:速度較慢

Linux和Solaris就是採用這種方法。

System stack

利用System stack儲存參數,藉由程式push到stack保存參數,再由OS從Stack中pop出來。

image 8 作業系統 – 中斷、系統呼叫、保護與安全

優:不限制傳遞參數的數量或長度
缺:速度較慢

API、系統呼叫、OS三者之間的關係

System call

當User Program執行時,若需要O.S.提供Service,則透過發出System Call通知O.S.,由O.S.執行相對應的Service Routine,以完成其要求的服務。

system call已經是非常底層的行為,一般使用者並不會直接接觸到。作業系統會將system call封裝成API,讓使用者方便使用。

為什麼使用API 而不是使用系統呼叫?

  • 簡單化:API是為應用程式定義的
  • 可攜式:API是一個統一定義的接口
  • 有效率:並非所有功能都需要作業系統服務或涉及核心,能不經過OS就別浪費時間

API

應用程式使用system call的介面,不須了解細節是如何執行的即可使用,一個API可能牽涉0或多個system call。

☑ 03. System Call (系統呼叫) - HackMD

典型實現例子(Linux)

Linux 的系統呼叫通過 int 80h 實現,用系統呼叫號來區分入口函式。作業系統實現系統呼叫的基本過程是:

  1. 應用程式呼叫庫函式(API);
  2. API 將系統呼叫號存入 EAX,然後通過中斷呼叫使系統進入核心態;
  3. 核心中的中斷處理常式根據系統呼叫號,呼叫對應的核心函式(系統呼叫);
  4. 系統呼叫完成相應功能,將返回值存入 EAX,返回到中斷處理常式;
  5. 中斷處理常式返回到 API 中;
  6. API 將 EAX 返回給應用程式。

系統程序(System Program)

系統程式提供程式開發與執行的便利環境。它們可分成:

  • 檔案管理:一樣具有新增、刪除、重新命名等功能。
  • 狀態資訊:提供詳細的表現紀錄資料。
  • 檔案的修改:使用文字處理器新增或修改檔案;也可下指令去搜尋特定檔案。
  • 程式語言支援:提供編譯器、翻譯器等功能。
  • 程式的載入與執行:提供重新定位裝載器等debug高階系統語言。
  • 通訊:提供機制給新增虛擬連接,含行程、使用者、電腦系統等;傳送訊息到其他瀏覽器,像是訊息、E-mail、遠程登錄等。
  • 背景服務:在電腦啟動時開始啟動,以使用者程式,而非核心程式執行,可進行系統維護、檢查。
  • 應用程式:不屬於一種系統,由使用者執行使用,通常不視為作業系統的一部分。

使用者對於作業系統的觀點大部分是由系統程式所定義,而非實際的系統呼叫。

保護和安全

安全(Security)

防護系統免於外部與內部的攻擊。
 範圍廣泛,包括了拒絕服務、蠕蟲、病毒、身份竊盜、服務的竊盜。

保護(Protection)

控制行程或使用者存取作業系統定義之資源的機制。

實施Protection 的前題:

  • 系統必須提供Dual-Mode運作。
  • 必須將會引起系統危害的指令,設定為特權指令(Privileged Instruction)

特權指令的種類:

  • I/O指令
  • 與記憶體管理有關的暫存器之修改指令
  • 與Timer設定有關的指令
  • Interrupt Enable/Disable 指令
  • 系統停止(Halt) 指令
  • 從使用者模式改變到核心模式的指令

I/O 保護

  • 防止User Program在執行時,直接使用I/O Device。
  • User Program必須透過O.S.提出I/O Request,再由O.S.控制I/O運作,並將I/O Result告知User Program。
  • 必須保護Interrupt Vector及ISR所在的Memory Area不被User Program更改,以防止User Program在Monitor Mode 下,取得對系統的控制權。

執行流程:

  1. 發出I/O Request,即System Call,會伴隨一些Trap,以轉換Modes
  2. 執行相對應的I/O服務
  3. I/O回傳結果給O.S.
  4. O.S.再將結果回傳給User Program
io protection 作業系統 – 中斷、系統呼叫、保護與安全

記憶體保護

保護執行中的程式(或O.S.)不會被其它程式所干擾。

  • Monitor Area的保護

保護Monitor (O.S.) 所在的區域不被User Program修改。

  • 各個User Area的保護

對各個User Program所在的Memory Area進行保護,以防止User Program之間企圖更改其它User Program所在的Memory Area。

Monitor Area保護的作法

有兩種作法:

1.使用Fence Register

Fence Register (界限暫存器)是用來記錄O.S.的大小(Limit)。

image 3 作業系統 – 中斷、系統呼叫、保護與安全

缺點

  • 需靠Dynamic Binding支援,且Execution Performance 變差。
  • O.S.通常有許多的錯誤處理程序,但不會一次就全部載入到記憶體中。
    • 當有一個錯誤發生,而O.S.在記憶體中查不到對應的處理程序時,就會利用Dynamic Loading的方式(即:Load on Call) 從Disk中載入相對應的處理程序,所以O.S.的大小會改變。
  • 若O.S.所在的區域大小動態改變,會造成User Process 的執行起始位置有所改變,此時所有的User Program皆須重新定址。

2.讓Monitor Area與User Area往相反方向增長

Monitor Area:由低往高擺。
User Area:由高往低擺。

image 2 作業系統 – 中斷、系統呼叫、保護與安全

User Area 的保護作法

使用一套Register來實作:

  • Base Register (基底暫存器):用來記錄User Program的起始位址。
  • Limit Register (限制暫存器):用來記錄User Program的大小。
OPERATING SYSTEMS: 8.) Hardware Protection

CPU 保護

防止User Program長期(甚至無窮) 霸佔CPU而不釋放之狀況。

O.S.會規定出一個User Program使用CPU time的合理最大值。一旦Process獲取CPU控制權時,會將此值設定給Timer (計時器),隨著Process的執行,Timer值會逐漸遞減直到Timer值為0。此時,Timer會發出一個“Time Out” 的Interrupt通知O.S., O.S.此時可以強迫Process放棄CPU。

Timer的用途

  • CPU Protection
  • Time Sharing System
    • 即:製作R-R Scheduling
  • DMA Controller設定中,傳輸量 (Counter) 大小的設定
  • 時鐘(Clock; 即系統時間)

0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論