跳轉到

1982 - QNX 微核心(10KB 的一切皆訊息)#

案件摘要#

1982 年,加拿大滑鐵盧大學兩位學生 Dan Dodge 與 Gordon Bell 創立 Quantum Software,推出 QNX—— 核心只有 約 10KB,採微核心 + 一切皆訊息設計:檔案系統、驅動、網路全部是使用者空間的行程。 史上最小的 Unix-like 微核心——後來跑進核電廠、手術機器人與美國陸軍的指揮系統。

前因 -- 為什麼會有這個案子#

  • 巨核心的恐懼:驅動一當機整台機器全死——工業控制不能容忍——彌補的缺陷:一錯全當。
  • 學生契機:Dodge 與 Bell 在大學上作業系統課時,覺得「我們可以寫得更好」——上課上出了商用 OS(與 Torvalds 1991 年寫 Linux 如出一轍)。
  • Unix 的啟發:Unix 的「一切皆檔案」抽象深深吸引他們——QNX 把它推進一步成「一切皆訊息」。

線索與推理 -- QNX 的技術面貌(1982)#

技術 QNX 狀態 彌補的缺陷
核心 約 10KB 微核心(排班 + IPC 而已) 巨核心一錯全當
IPC 一切皆訊息:send/receive/reply 系統呼叫與 IPC 兩套介面
驅動/檔案系統 使用者空間行程——掛了自動重啟 驅動當機全死
可靠性 任何服務當掉,微核心偵測並重啟 無看門狗的系統
授權 商用(2017 讓 Blackberry 開放核心授權) 開源微核心要等 ARM 上 QNX 開放

C 範例:QNX 的一切皆訊息#

/* QNX:檔案系統、驅動全是行程——讀檔就是送訊息 */
#include <sys/qnx.h>

/* 客戶端:open/read 其實都是訊息 */
int fd = open("/dev/ser1", O_RDWR);
read(fd, buf, 100);
/* 等價於: MsgSend(server_pid, &msg, &reply, sizeof msg); */

/* 伺服器端(驅動行程):掛了微核心會重啟它 */
while (1) {
    MsgReceive(chid, &msg, sizeof msg, NULL);
    process(&msg);
    MsgReply(rcvid, 0, &reply, sizeof reply);
}
(驅動當機 ≠ 系統當機——訊息傳遞的故障隔離,微核心理論的勝利。)

Shell 篇例:QNX 的真實使用#

# QNX 4:行程列表——每個驅動都是一個行程
$ ps
  PID   NAME     PRI  STATE
    1   /boot/sys/Proc32   30f  READY
    2   /boot/sys/Slib16   20f  READY
    8   /boot/sys/Fsys     10o  RECV    # 檔案系統是行程
   10   /boot/sys/Dev      10f  RECV    # 驅動是行程

結案 -- 後果與影響#

  • 1992 年 Tanenbaum–Torvalds 辯論:QNX 是微核心務實成功的活證據——微核心不是不行,是看戰場。
  • 安全關鍵市場的霸主:核電廠、醫療設備、汽車(Blackberry QNX 2010 收購後稱霸車用 OS)。
  • 1989 年 POSIX 標準化後 QNX 提供完整 POSIX 相容——證明微核心也能跑 Unix API。
  • 歷史教訓:把服務搬出核心 = 故障隔離;10KB 核心證明「最小特權」可以做得極小。

關鍵人物與文獻#

  • D. Dodge / G. Bell:QNX (1982)。
  • A. S. Tanenbaum:1992 年辯論(微核心陣營引用 QNX)。
  • 相關案件:../UNIX/1987-MINIX微核心.md、../UNIX/1991-Linux誕生.md、1993-VxWorks與POSIX即時標準.md。