---
# System prepended metadata

title: Limited Direct Execution
tags: [OS]

---

# Limited Direct Execution

> [OSTEP Limited Direct Execution](https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-mechanisms.pdf)

## OS User & Kernel Mode

當代的 OS 設計要處理以下兩個問題
1. 如何讓使用者設計的程式在被 OS 監管的狀況下執行
    > 讓處理器和作業系統都具備 User 和 Kernel Mode，如果使用者的程式需要存取硬體資源，根據要執行的硬體任務發起特定的 System Call，然後 Trap 到 Kernel Mode 讓 OS 取得處理器所有權去替使用者執行
3. 如何讓 OS 在必要時取得處理器所有權
    > 早期使用合作 (Cooperation) 的方式，OS 在使用者程式發起 System Call 或是有中斷 (Interrupt) 產生時取得處理器控制權，但是當使用者程式產生無窮迴圈會有問題，之後改成使用時鐘中斷 (Timer Interrupt)，在固定的時間內會發起一次時鐘中斷讓處理器暫停目前行程改成執行 OS

## Trap & Interrupt

當代作業系統在開機後的設定步驟，以下三個步驟都是在特權模式下使用特權指令完成
1. 設定處理器，讓處理器知道 Trap Table 的記憶體位址
2. 設定 System Call Handler 和 Timer Handler
3. 啟動 Timer，讓 Timer 在固定時間內讓 OS 取得作業系統所有權

Trap Table 可以預先設定當使用者程式發起 Trap 時應該要如果處理目前行程的狀態再進入 Kernel Mode，因為讓使用者程式選擇任意的 Kernel Code 進入是不安全的，所以使用者只能先紀錄在要做的 System Call 編號，然後由 Trap 指令統一進入 Kernel Mode，使用者程式 Trap 之後 Trap Table 會有對應的組合語言儲存目前行程的 Context (Registers, PC ...) 到 Kernel Stack，然後根據不同的 System Call 呼叫對應到 System Call Handler 的功能，最後 Kernel 將行程的 Context 恢復，然後 Return from Trap 繼續執行使用者行程

時鐘中斷會固定時間轉移處理器所有權給 OS，下圖所示時鐘中斷後，先儲存行程 A 的 Context，然後 OS 決定改成執行程 B，恢復行程 B 的 Context 之後 Return from Trap 執行行程 B

![Screenshot from 2025-04-16 11-18-29](https://hackmd.io/_uploads/rkXs-s2RJe.png =500x)
