---
# System prepended metadata

title: 應用視角的作業系統

---

# 應用視角的作業系統

:::info
課程：南京大學蔣炎岩教授 [操作系統（2025 春）](https://jyywiki.cn/OS/2025/)
:::

從我們熟悉的軟體領域（高階程式語言）往下探到程式如何與 OS 合作

## Background

### 電腦作為 Turing Machine 的現代實作版本，是一種狀態機

- 在任何時刻，都可以用一組「狀態」完整描述
- 執行一條指令，就是從「狀態 A」→「狀態 B」

> 只要一個東西符合這三件事：
> 1. 在任何時刻，都有一個可描述的狀態
> 2. 會因為某些事件而改變狀態
> 3. 狀態改變是有限規則下的轉移
>
> 那它就可以被建模為狀態機

### 電腦在執行程式時就是在管理狀態的變化

- 名詞定義
    - PC（Program Counter）：CPU 裡的一個暫存器，永遠指著下一條要執行的指令
    - Stack Frame：一次 function 呼叫的執行現場，裡面會存放
        - local variables
        - return address（function 執行完要回去的位置）
- 過程
    1. PC 指向 `main()`，此時僅有一個 stack frame，且所有的 global variables 都是初始值
    2. CPU 依照 PC 指向的指令執行，過程中會修改 register 或 memory 中的狀態
        - 若執行到 function call：
        - 將 return address push 進 stack（形成新的 stack frame 往上疊）
        - PC 改為指向被呼叫 function 的第一條指令
        - 執行後狀態改變，形成新的狀態
    3. 當 function 執行完畢：
        - stack frame 會被 pop
        - PC 會被設為該 frame 中的 return address
        - 繼續執行呼叫者後續指令
    4. 直到所有 stack frame 都被 pop，程式 return

## Hook

此種「狀態遷移」的概念可以適用到所有純粹的計算，均指改變「程式內的狀態」

但是有些 standard library 暴露出來的 API 需要改變「程式外的狀態」，這些有副作用的呼叫都需要由 OS 處理

- e.g. `putchar` 真的會在物理意義上產生一個實體（螢幕上的像素點）

這就是為什麼純計算語言最終一定需要作業系統

## What Does OS Do?

當程式在執行「會影響程式外世界」的操作時，就需要將控制權交給 OS 代為執行，執行入口就是 ABI (Application Binary Interface) 層級的系統調用 (syscall)

- e.g. 在 `putchar` 背後發生的事情是

   ```bash
   putchar (libc)
     → write (syscall)
        → kernel
           → device driver
              → hardware
   ```

所以 OS 的職責就是提供一組「安全、受控、可抽象化的介面」，讓應用程式能在不理解硬體細節的情況下，合法地改變世界
