# What is an Operating System?

一個特別管理電腦硬體與軟體資源的系統程式。

Permanent Software:電腦啟動後永遠存在,沒有它電腦就不會運作
Abstracts 硬體資源:把底層的各種資源變成一堆 API 給使用者方便使用

  • OS 主要功能 / 系統觀點
    • 資源分配者 (resource allocator) manages 和 allocates resources 來確保公平性和效率
    • 是一套控制程式 (control program) 監控使用者與程式的行為防止不正常的運作造成對系統的危害
  • 目標 / 使用者觀點
    • 提供一個方便使用的環境
      ex:PC
    • 有效率地使用電腦資源
      ex:大系統,多使用者系統
  • OS 的重要性
    • 是 user program 和 hardware 之間 唯一 的 interface,一定需要經過它
    • 一旦 crash 掉整台電腦就掛了,要求絕對不能有 bug

# 電腦的基本架構

由 Hardware、OS、Application、User 組成

  • User:people、machines
  • Application:使用 system resources 來解決問題的方式,像是各種軟體
  • Operation System:controls 與 coordinates 資源的使用
  • Hardware:提供基本的計算資源(CPU、memory、IO devices)

# General-Purpose Operating Systems


例子:user 呼叫 printf -> printf 呼叫 system call -> system call 呼叫 driver…

# Multi-tasking Operating System

  • 管理資源與程序讓多個使用者程式使用
  • 提供 API

# Computer-System Organization

  • 一個或多個 CPU、Memory、IO Device 等連接一個共同的 Bus

  • 存取共同記憶體。I/O 裝置和 CPU 可以同時執行並競爭記憶體

  • 作業系統負責 Control 和 Coordinate

  • 發生一個事件時,由硬體或軟體產生中斷來通知。近代的作業系統是中斷驅動 (Interrupt Driven)

# Device Controller (Hardware)

  • 每一個 裝置控制器 (Device Controller) 負責一個特定型態的裝置
  • Status reg:記錄現在 device controller 是 busy 還是 idle
  • Data reg 和 buffer:用來存資料
    • CPU 下指令後,裝置控制器就能夠去 access disk 資料到自己的 local buffer
    • 會先寫到 reg 再寫到 buffer
  • Memory 是 CPU 在用的,所以 CPU 負責 移入 / 移出 memory 的資料到 Device Controller 上的 local buffer
  • 由於 Device Controller 上的 Buffer 空間是有限的,因此會需要用一些技巧來解決,像是 Busy/wait、Interrupt

# Busy/wait output

讀資料時 I/O Device 需要先和 Device Controller 做 I/O,跟 cpu 無關
但是後面因為 memory 是 cpu 在使用的,所以後半段的操作就需要 cpu 去下指令操作

那麼 cpu 那邊要怎麼控制呢?
一個早期大家想到的最簡單的方法就是 Busy Waiting,完全由 cpu 來控制,這邊舉個簡單的例子:

  1. 目標:把一串字串寫到 I/O Device 上,
  2. 挑戰:因為 buffer 空間大小,cpu、memory 的速度太快,不可能將資料一次性全塞進去
  3. 方法:如果 buffer 寫滿了就等到 buffer 寫到 Disk 上,清空後再寫下一批
  4. 缺點:中間花一段時間在等 buffer 清空,也就是 cpu 有某種程度的 idle,整個效率會很差
1
2
3
4
5
6
7
8
9
#define OUT_CHAR 0x1000 // device data register
#define OUT_STATUS 0x1001 // device status register

current_char = mystring;
while (*current_char != '\0') {
poke(OUT_CHAR,*current_char); // buffer
while (peek(OUT_STATUS) != 0); // busy waiting
current_char++;
}
  • while ( *current_char != '\0')
    檢查字串是否結束
  • while ( peek( OUT_STATUS ) != 0 );
    因為怕 buffer 還沒清空,是 busy 的狀態,所以會需要一個 while loop 去檢查 Status Register 的值:
    • 如果 status register 的值不是 0,表示 buffer 還是 busy 狀態,cpu 就會一直等在這邊
    • 直到 status register 的值變成 0,表示 buffer 空了,cpu 才會繼續往下執行

# Interrupt I/O

Interrupt 的處理流程:

  1. 作業系統收到後,若該處理為必要時,則作業系統會暫停目前 Process 執行,且保存其 「Status」、「Register」(Context switch)
  2. 作業系統會依據「Interrupt ID」(Interrupt number)查詢「Interrupt Vector」以確認何種中斷被觸發,且找出其「Interrupt service routine」(ISR)在記憶體的位置
  3. 在處理器中的指令會跳至該服務程序位置,執行「Interrupt service routine」
  4. 完成「Interrupt service routine」後,將控制權返回給 Kernel
  5. 作業系統恢復(Resume)中斷之前 Process 的進行。

小備註:

  • ISR (Interrupt Service Routine):中斷服務常式,當中斷發生時,系統會跳轉到這段程式碼來處理中斷事件
  • Interrupt Vector:含所有 service routine 的 address (function pointer),儲存各種中斷對應的服務常式位址
  • Context Switch:當中斷發生時系統需要保存當前程式的狀態,以便中斷處理完成後能夠恢復執行
  • 在處理一個 interrupt 時禁止傳入其他 interrupt,以防 lost interrupt

# Hardware Interrupt (Signal)

  • 時機:硬體任何時間都能發出信號給 CPU
  • 特點:
    • signal 都會有一個 singal number,根據這個 number 去找 vector 上的欄位
    • 每個 port 的 hardware 有燒死的 singal number
      裝 driver 的時候會 overwrite 那個欄位 fucntion pointer 的位置,去執行你要處理的程式碼
  • Interrupt Service Routine

# Software Interrupt (Trap)

  • 時機:

    • (主動)user 對 OS service 的 request (system call)
    • (被動)軟體發生 error (segmentation fault、除以零…)
  • 特點:

    • 用 switch case 而不是 array,因為軟體有無限的可能性,可以任意定義各種不同的 system call
    • 根據 system call 的 number 去找尋對應的 function call,不過流程差不多
  • Interrupt Service Routine

# Storage-Device Hierarchy


這是最傳統的架構,現在有很多其他的 storage device 會插在中間
真正的大型的系統最後還是用 tapes,因為非常 reliable,不太容易壞,而且很便宜

  • 考量點:speed, cost, volatility

    volatile 關掉會遺失(memory 以上全部都是 volatile)

  • Storage Structure:
    • 主記憶體 (main memory)
      • CPU 能夠直接 access 的唯一大型的 storage
      • 例如:RAM(Random Access Memory)
    • 輔助記憶體 (Secondary storage)
      • memory 以下都叫做 secondary storage,代表 CPU 沒辦法直接讀取
      • 是大型的 non-volatile storage
    • 快取 (Cache):
      • 使用中的資料暫時從較慢的存儲複製到較快的存儲
      • coherency (連貫性) & consistency (一致性) 議題
        若對上層的資料做了修改沒有更新到下層的資料,這時候兩邊的資料會不一致
        必須保證任何一處的資料都一樣,否則就要保證 user 能找到最新的
        • Single task accessing:都用最上層的資料基本上沒問題
        • multi-task accessing:需要處理大量這類的問題
        • distributed system:更加複雜,因在不同電腦上且還要考慮到網路

# Random-Access Memory (RAM):

  • SRAM (Static RAM)
    • 需要六個電晶體
    • 消耗較多能量
    • 讀取快
    • 應用在快取
  • DRAM (Dynamic RAM)
    • 需要一個電晶體
    • 消耗較少能量
    • 體積小,速度比較慢
    • 資料要定期更新
    • 應用在主記憶體

# HW Protection

指很多程式在執行或是很多使用者在執行時,不會影響彼此

# Dual-Mode Operation

  • OS 把影響重大的指令設為 ** 特權指令 (Privileged Instruction)** 以保護重要的資源,需要 Kernel mode 才能執行
  • 需要硬體的額外支援,用一個 Mode Bit 記錄權限
    Mode bit 被加到 HW 表示現在是什麼 MODE,如 kernel (0) or user (1)
  • User Mode (Mode Bit==1):一般模式
  • Kernel Mode (Mode Bit==0):在此模式下才有權利執行特權指令
  • 特權指令的種類:
    • I/O 指令
    • 與記憶體管理有關的暫存器之修改指令
    • 與 Timer 設定有關的指令
    • Enable/Disable 指令
    • 系統停止指令
    • 從 user mode 改變到 kernel mode 的指令

# I/O Protection

  • 與 I/O 有關的 instruction 全都都是 privileged instructions ,因為 I/O 的資源是 share 的
    像螢幕輸出都是同一個螢幕,硬碟儲存也是同一顆硬碟
  • 其實還是有些漏洞,就算沒法繞過 I/O 但是可以繞 memory
    像透過合法的 I/O 流程去修改原本應該要執行的函式讓它執行我們想要的事

# Memory Protection

  • 保護以下
    • Interrupt vector & the interrupt service routines
    • 別的程式的資料存取和覆寫
  • 保護的方式
    • Hardware Support
      使用兩個 register 來記錄能夠讀取的記憶體區間
      • Base register:儲存實體記憶體的位址,剛好指向虛擬空間的開頭
      • Limit register:儲存整個虛擬空間的大小
    • 定義範圍外的 memory 是被保護的,超過這段空間會有 Segmentation Fault

# CPU Protection

  • 阻止某隻程式霸佔 CPU 無法歸還給作業系統,像是無窮迴圈
  • 方式:Time sharing(有 Timer 計時)
    1. Timer 慢慢減少,當變成 0 時會送出 Interrupt
    2. 打斷原本的 Process 並執行 OS 的 Scheduler,控制權就會回到 OS
    3. OS 再決定是不是要繼續剛剛的 Process

    Load time 到 register 的 instruction 也是 privileged instruction,只有 OS 可以調整 Timer 數的時間