作者曾在 Windows 驅動開發領域耕耘兩年,後轉投 Linux 核心開發亦有兩年經驗。本文從技術實踐角度,深度剖析兩大主流作業系統核心的異同,重點聚焦於核心架構、開發模式與工程哲學差異。
核心哲學差異:商業閉源 vs 開源開放
Windows:商業軟體模式
- 原始碼機密,需簽署 NDA(保密協議)並通過微軟審核才能取得
- 文檔依賴官方授權書籍(如 Windows Internals)、MSDN、DDK/WDK
- 逆向工程是了解未文檔化行為的主要手段
- 優勢:二進制相容性極強,WDM 驅動少量修改即可跨 Win98/2K/XP 運行
Linux:開源模式
- 原始碼完全公開,「RTFS (Read The F***ing Source Code)」是核心開發文化
- 核心變化快,文檔維護成本高,往往不如原始碼準確
- 優勢:學習門檻低、彈性極大,可直接閱讀、修改、重新編譯核心
- 編譯核心僅需標準 GCC 工具鏈,產出為普通可執行檔(
vmlinux/bzImage)
發布模式差異:二進制 vs 原始碼
| 維度 | Windows | Linux |
| 發布形式 | 預編譯二進制(.exe/.msi/.sys) | 原始碼為主,配合套件管理器(yum/apt/pacman) |
| 安裝體驗 | 雙擊下一步,極度友善 | 早期需 ./configure && make && make install,依賴地獄常見 |
| 原始碼優勢 | 商業機密,不公開 | 可針對架構優化、啟用/停用功能、編譯期優化優於執行期 |
現代 Linux 發布版透過 yum/dnf/apt/zypper/pacman 等套件管理器,已大幅簡化安裝流程,依賴自動解決。
進程模型核心差異:CreateProcess vs fork()+exec()
Windows:CreateProcess
- 單一 API 呼叫,需傳遞 10+ 參數(應用程式路徑、命令列、安全屬性、繼承旗標、建立旗標、環境區塊、目前目錄、啟動資訊、進程資訊等)
- 進程 = 資源容器(位址空間、句柄表、Token 等),不可執行,必須包含至少一條執行緒才能跑程式碼
Linux:fork() + exec()
fork():無參數,複製父進程位址空間(Copy-on-Write 優化),子進程返回 0,父進程返回子 PID
exec():在子進程中替換映像為新程式
- 進程 = 可執行實體,擁有獨立位址空間與執行緒上下文
- 這設計體現 Unix 「小而美、組合大於繼承」哲學
核心開發體驗對比
- Windows:Windbg 核心除錯、DDK/WDK 工具鏈、強類型驅動模型(WDM/KMDF/UMDF)、版本相容層完善
- Linux:kgdb/kdb/ftrace/perf/bcc/eBPF 觀測工具鏈豐富、模組化設計(.ko)、核心版本間 API 可能不相容需遷移
總結與建議
兩大核心各有千秋:
- Windows 適合追求商業穩定、硬體廠商支援、統一生態的場景
- Linux 適合追求技術透明、高度客製化、雲原生、嵌入式、高效能運算場景
跨平台開發者建議:深入理解兩種哲學,而非單純比較優劣。Windows 開發者轉 Linux 時,最大心智轉變是從「呼叫 API」轉向「閱讀原始碼、理解資料結構與演算法」。