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。