# Chap. 01 - Introduction > 課程內容參考 : 清華大學開放式課程 周志遠教授 > 參考書目 : Operating System Concepts (9th), Abraham Silberschatz, Peter Baer, Galvin, Greg Gagne > > 其他科目內容請參見 [[Here]](https://hackmd.io/@ChenZE/By4SOO6Jyl) > **Note:** [#polling](#Q-請解釋何謂輪詢polling?) [#interrupt](#Q-簡單說明-interrupt-的機制與用意) [#ISR](#Q-何謂中斷服務程式ISR與中斷向量interrupt-vector) [#interrupt vector](#Q-何謂中斷服務程式ISR與中斷向量interrupt-vector) ## Content * [What is an operating system](#What-is-an-operating-system) * [1. Computer system](#1-Computer-system) * [2. Operating system](#2-Operating-system) * [2.1 Definition of an operating system](#21-Definition-of-an-operating-system) * [2.2 General-purpose operating system](#22-General-purpose-operating-system) * [Computer-system organization](#Computer-system-organization) * [1. Computer-system operation](#1-Computer-system-operation) * [2. Busy/wait output](#2-Busywait-output) * [3. Interrupt](#3-Interrupt) * [3.1 Hardware interrupt](#31-Hardware-interrupt) * [3.2 Software interrupt](#32-Software-interrupt) * [3.3 Others](#33-Others) * [4. Storage device](#4-Storage-device) * [Hardware protection](#Hardware-protection) * [1. Dual-mode operation](#1-Dual-mode-operation) * [2. I/O protection](#2-IO-protection) * [3. Memory protection](#3-Memory-protection) * [4. CPU protection](#4-CPU-protection) ## What is an operating system ### 1. Computer system 電腦系統可以粗略分為 4 個元素: (1) **硬體**(hardware) (2) **作業系統**(OS) (3) **應用程式**(application) (4) **使用者**(user) * User: 使用者的定義非常廣泛,可以是人、機器或甚至其他電腦 * Application: 使用系統資源(system resource)來解決計算問題(computing problem)的方法或程式 * Operating system: 用來**控制(control)與協調(coordinate)硬體資源**的使用 * Hardware: 提供基本的計算資源(computing resource),像是 CPU、memory 或 I/O 設備 > [!Note] Hardware 在 OS 中也可以通稱為資源(resource) <img src="https://hackmd.io/_uploads/rkNr3hbbkx.jpg" width=400> 以上 4 個元素彼此間的關係如上圖所示,user 會使用 application,而 application 是建立在 hardware 上的資源執行,中間的 **OS 則作為 application 與 hardware 之間的==溝通橋樑==**。 ### 2. Operating system 作業系統可以被視為永久的軟體,只要一開機就會**常駐於記憶體**之中,主要的目的是用來**控制硬體**,或將**硬體資源抽象化**(abstract)成 API 後提供給 user 與 application,讓 user 能夠使用這些 API 控制資源。 > [!Note] API = Application Programming Interface #### 2.1 Definition of an operating system 作業系統的定義可以從三個不同的面向做切入 * Resource allocator: 管理(manage)與分配(allocate)資源,確保有效且公平的執行 * Control program: 控制 user program 的執行與 I/O devices 的運算,預防錯誤以及資源不正當使用 * **Kernel**: 作業系統的別名,是一種常駐在記憶體中隨時都在執行的 program 事實上作業系統並沒有一個很全面的定義,只要知道他的概念以及能夠做些什麼事情即可。 #### 2.2 General-purpose operating system 作業系統執行的過程可以以下圖說明 <img src="https://hackmd.io/_uploads/ryH_LabZ1e.jpg" width=600> 1. Device drivers * Driver 可以視為部份的 OS * 每個 device 都有自己的 driver,必須有 driver 才能夠控制對應的 resource。例如每次電腦新插額外裝置(Ex: USB)時,都會先進行驅動程式的安裝 2. OS 會把 device driver 提供的資源抽象化成 API 後打包成 system library 3. library 可以想像成是有很多函式包成的檔案(Ex: C 中的 `<stdio.h>`) 4. Linker 的作用是連接這些 API library 以及編譯(compile)好的 program * 類似 C 語言執行 `printf` 時需要連接螢幕,所以會呼叫 system library 中的函式使用 ## Computer-system organization ### 1. Computer-system operation 電腦系統的運算過程如下圖所示。因為 CPU 與 I/O device 的計算執行速度差異太大,所以兩者之間會多一個 device controller 來做協調。 也因為兩者的執行速度差異太多,所以 Device controller 內部會有一個緩衝區(buffer),device 進行 I/O 時會先將資料寫入 buffer 中,CPU 再透過 buffer 讀取資料到 memory,反向亦同,CPU 將資料也務 buffer,I/O 再慢慢將資料寫入到 device 中。 ![image](https://hackmd.io/_uploads/SJTw3T--yl.png) ### 2. Busy/wait output > [!Tip] **Interview Ques.** > ##### Q: 請解釋何謂輪詢(polling)? > CPU 會不斷測試等待週邊裝置是否準備好,通常會用一個 `while` 迴圈做 polling。 **早期**的電腦架構在進行 I/O device 的運算時,採用的是 ==**busy waiting**== 的方法。在這種方法中,CPU 會有一個指令(通常是 `while` 迴圈)**不斷的進行測試等待,==輪詢(polling)== 每一個 I/O device 檢查它是否準備好**。但 CPU 在等待的過程中因為沒有辦法做其他事情,所以是處於一種 **閒置(idle)** 的狀態,造成資源以及時間的浪費。 如以下程式碼片段中要進行資料的寫入,一次只寫入一個字元,內層的 `while (peek(OUT_STATUS)!=0)` 就是在不斷的做測試等待 I/O 完成,檢查目前的字元寫入完成沒,寫好了就會換下一個字元繼續進行。 ```c #define OUT_CHAR 0x1000 // device data register #define OUT_STATUS 0x1001 // device status register current_char = mystring; while (*current_char != "WO"){ poke(OUT_CHAR, *current_char); while (peek(OUT_STATUS) != 0); // busy waiting current_char++; } ``` ### 3. Interrupt > [!Tip] **Interview Ques.** > > ##### Q: 簡單說明 interrupt 的機制與用意 > Interrupt 是一種由 I/O 裝置或其他硬體發出的**訊號**,用來**通知** CPU 某個事件發生,要求它**暫停目前正在執行的程序**,轉去**執行對應的中斷服務程序**(ISR)。當 ISR 結束後,CPU 能**回到原本的執行點繼續**執行。這種設計讓 CPU 不需要持續等待或檢測 I/O 裝置的完成,**提高 CPU 的使用效率**。 > > (補充:請說明 polling 與 interrupt 的差別與使用時機?) > 如同上面所說,因為 busy waiting 的操作方式**效率低下**,在測試 device 完成期間 CPU 無法進行其他工作,所以現代電腦的 I/O device 操作都是使用 **interrupt** 的方式進行。 所謂的 **interrupt** 指的是 ==**允許 device 能夠改變 CPU 執行指令的順序**==,強迫 CPU 轉做其他的指令。如下圖所示。 ![未命名](https://hackmd.io/_uploads/Bk5SGAZbJe.png) 1. 一開始 CPU 在執行其他的程式,I/O device 處於閒置(idle)狀態 * 當 I/O 發出 request 後就開始運作與 data transfer(傳輸到 buffer) 2. I/O device 的 data transfer 結束(Ex: buffer 滿) 3. I/O 完成任務後會發出一個 interrupt **打斷** CPU 目前正在處理的事情,並**優先處理 I/O 的結果** 透過 interrupt 的機制來完成 I/O 切換工作的 OS 又稱為 **interrupt-driven I/O**,具體流程圖如下圖所示。 <img src="https://hackmd.io/_uploads/BJZ47rnW1e.png" width=600> 1. 一開始 device driver 初始化 I/O 設備 2. 發出一個指令給 controller 讓他開始搬移資料(同時 CPU 也還在繼續進行動作) 3. I/O 開始搬移資料 4. **完成動作後發出一個 interrupt 給 CPU** 5. CPU 接收 interrupt 後再**視排程或優先性決定要執行哪個程式** 6. 執行完成後恢復原來 CPU 狀態 7. 進行其他 I/O 現代的 OS 基本上都是透過上述的 intrrupt 方式進行,而 interrupt 又可以分為由 **H.W. 產生**或是由 **S.W. 產生**。 * 由 H.W. 產生 * Hardware 藉由發出一個 signal 給 CPU 來引發 interrupt * 這種藉由 hardware 產生的 interrupt 稱為 ==**signal**== * 由 S.W. 產生 * Software在**執行時發生錯誤**(Ex: 除以 0)或是**要求作業系統支援**(system call) * 這種由 software 產生的 interrupt 稱為 **==trap==** > [!Note] > Software 泛指 user 的程式。兩種 interrupt 的差別在於: > > * Signal 是發出 interrupt **讓 CPU 處理 I/O 完成的資料** > * Trap 是發出 interrupt 來**將控制權切換到 OS 中**,讓 OS 介入操作。 #### 3.1 Hardware interrupt Hardware 的 interrupt 發生過程如下圖所示。 <img src="https://hackmd.io/_uploads/r1TtwS2-kx.png" width=600> 1. 當某個 device 發生 interrupt 時,會發出一個 signal 給 CPU 2. 此時 CPU 執行的指令會**被中斷**並**跳轉到** **ISR** 所在的記憶體位址(通常是固定的)開始執行 3. 執行完後會**回到 interrupt 前的指令**繼續執行 > [!Note] > * 中斷服務程序(**I**nterrupe **S**ervice **R**outine, ISR) > * 是當 H.W. 發出 interrupt 時 **CPU 要跳去執行的一段特定程式碼**(類似函式概念) > * 中斷向量(Interrupt Vector) > * 因為 interrupt 發生時必須**把 CPU 的控制權轉移執行 ISR** > * 考慮到 interrupt 會**頻繁發生**且必須**迅速處理**,因此**會用一個表格(或陣列)來==儲存不同裝置的 ISR 的指標==** > * 通常是該段程式碼的**起始位址** > * 每當發生 interrupt 時 **ISR 會透過這個表格/陣列被間接呼叫** > * 這個表格/陣列被稱為**中斷向量(interrupt vector)** > [!Note] > * 裝置控制器(controller) > * 電腦周邊硬體設備的晶片,與實體裝置連接且內建暫存器 > * 功能: > * 直接控制 I/0 設備 > * 根據驅動程式的指令執行操作 > * 發出 interrupt > * 驅動程式(driver) > * 執行在 OS 內核的軟體程式,為 OS 提供**與硬體互動的抽象介面** > * 功能: > * 將系統層級的操作(Ex. read/write)轉為 H.W. 可理解的型式 > * 設定 controller 的暫存器 > * OS 與 controller 間的**橋樑** <!-- :::info **補充** 1. 安裝 device driver 的時候,將 device 插到主機板(MB) 上的哪個 port,就會把 driver 放到特定的位址,無法改變 2. interrupt vector 其實就是一個用來儲存 function pointer 的 array,或是也可以看成一個表格,裡面儲存了各種處理 interrupt 的對應程式的入口位址,當發生特定 device 的 interrupt 時會進入到這裡找到能夠處理這個 interrupt 的程式的位址。 3. 當 CPU 接收到 interrupt 並從 interrupt vector 找到對應的處理程序位址後,就會跳到這些位址執行。這些能夠處理對應 interrupt 的處理程序又稱為 interrupt service routine 或 interrupt handler 4. 發生 interrupt 時會紀錄當下的 program 資訊,以便處理完後再做恢復 ::: --> #### 3.2 Software interrupt 與 hardware interrupt 類似,當 user program 執行到某個**需要 OS 服務的操作**時會觸發 trap,是由 user 主動**使用 system call 引起**的。 <img src="https://hackmd.io/_uploads/Sy4haH2-ke.png" width=500> > [!Tip] **Interview Ques.** > ##### Q: 何謂中斷服務程式(ISR)與中斷向量(interrupt vector) > ISR 是當中斷發生的時候,負責處理該事件發生的一段特殊函式。ISR 執行結束會 CPU 會再恢復到原本位址繼續執行指令。 > 中斷向量是一塊固定的記憶體位址,裡面儲存了 ISR 的位址,每個 ISR 對應一種中斷事件,CPU 會透過中斷向量查找 ISR 的位址去執行。 #### 3.3 Others * Interrupt 必須儲存發出 interrupt 的 program 的 address,才能再處理完 interrupt 後返回原來的 program * 當有很多個 interrupt 接續而來時,會直接忽略後面的 interrupt,直到前面的處理完才會處理後面的 interrupt。例如某些時候滑鼠會卡住不能動,因為前面其他的 I/O interrupt 還沒處理完 ### 4. Storage device <img src="https://hackmd.io/_uploads/SkFuGIhZJl.png" width=550> 儲存設備是由階層式的設計構成,一般會注意三件事 * 速度(speed) * 成本(cost) * 揮發性(volatility) * 揮發性: 斷電後資料會消失 * 非揮發性: 斷電後資料不會消失 在上圖的階層式設計中,**main memory 是 CPU 唯一可以==直接做存取==的儲存設備**,是透過**記憶體控制器進行**,main memory 以下的設備都必須透過 I/O 來進行存取。 Main memory 通常是採用隨機存取記憶體(**R**andom **A**ccess **M**emory, RAM),指的是**不論在哪個位址存取的速度都一樣**。RAM 依照功能不同又可以分為兩種類型 * DRAM * 電力需求較少,速度較慢 * 用於 main memory * SRAM * 電力需求較多,速度較快 * 用於 cache :::info 在 cache 中,資料暫時從較慢的 main memory 複製到較快的地方使用。只有進行資料的複製,而不是資料的搬移。 ::: ## Hardware protection 這邊所指的 protetion 是針對硬體設備的保護,而不是軟體層面的資安問題。用意是在 multi-programming 下,不影響其他 programming 的使用。 ### 1. Dual-mode operation 在多工模式下為了保護系統資源,所以區分成兩種模式 * User mode * 指的是 user 所發出的 instruction * Kernel mode * 由 OS 所發出的 instruction * 通常是 user 透過 system call 要 OS 執行的 instruction 為了因應兩種模式的切換,hardware 會使用一個 bit 來區分當前模式(mode bit),只要 interrupt 發生,就會立即切換 kernel mode,處理完後再回到 user mode。 ![image](https://hackmd.io/_uploads/H11MdLnZkx.png) 在 kernel mode 中有一種被稱為 privileged instruction 的指令。這是一種具有某些特權的 instruction,通常是指會危害到電腦運作的 instruciton。這些指令只能在 kernel mode 中執行,如果 user 想要使用的話只能透過 system call 來執行(Ex: `printf`) > [!Note] > 各種 multi- 概念 > * 多處理器(multi-processor)系統 > * 每個處理器都有: 單一顆 CPU 核心(core) + 暫存器(register) + 快取(cache) > * 多核心(multi-core)系統 > * 單一處理器(processor)中有多個 CPU 核心(core),每個核心有自己的暫存器與快取 > * 核心(core)是 CPU 的基本計算單位 > >![image](https://hackmd.io/_uploads/B1hk-r0akl.png) > > * 多工(multi-programming)模式 > * 記憶體中**同時放置多個正在執行中的 program** > * 當某個 program 切換到 I/O 計算時 CPU 可以執行其他的 program 而**不會閒置** > * 正在執行的 program 又稱為 **process** > * 多任務(multi-tasking)模式 > * 建構在 multi-programming 的基礎之上 > * 作業系統每過一段間會**主動打斷** CPU 正在執行中的程式,**強迫它切換**到其他程式執行,讓使用者感受到跟電腦間的**互動(interaction)** > * 需要依靠 **time-sharing** 的技術才能做定時切換 > * 與 multi-prgramming 的差別: **不論有沒有 I/O 的介入,都會因為 time-sharing 的原因切換執行中的程式** ### 2. I/O protection 與 I/O 相關的 instruction 都是 privileged inst. <img src="https://hackmd.io/_uploads/BJaXKLnZkx.png" width=400> ![未命名]() ### 3. Memory protection 確保資料的存取(access)或覆寫(over-write)不會影響到其他的 program。由硬體支援上會設計兩個特殊的 register。 * Base regiser : 儲存最小的 physical memory address * Limit register: 儲存範圍的大小 執行程式時會檢查這兩個 register,如果 instruction 超過這個 address 表示無效,如下圖所示。 <img src="https://hackmd.io/_uploads/rkNVcLnWkl.png" width=400> :::info 有一個 privileged instruction 可以更改這個兩個 register 所儲存的數值,例如 C 語言中的 `malloc()` 函式就可以透過 system call 來做更改。 ::: ### 4. CPU protection CPU protection 的目的是阻止某個 program(包含 OS)過度霸佔 CPU 的資源,簡單來說就是 time-sharing 的設計概念。 硬體支援的設計上會有一個 timer,當某個 program 過度使用 CPU 時,timer 會發出一個 interrupt 中止該 program 繼續使用 CPU。