Cygwin 系列(一):Cygwin 是什么


Cygwin 系列(一):Cygwin 是什么

本文 4300 余字,閱讀約 11 分鍾,本文知乎鏈接:Cygwin 系列(一):Cygwin 是什么

本文接上篇 Cygwin 前傳:從割據到互補。先一句話回答標題:Cygwin 是一個可原生運行於 Windows 系統上的 POSXI 兼容環境

前言:從軟件角度理解系統

計算機世界里存在各種各樣的操作系統,目前通用操作系統有主流的三大類:

  • UNIX,通用操作系統鼻祖,發展出特別多衍生系統;
  • Windows,微軟家根基,桌面市場霸主;
  • GNU/Linux,UNIX 近親,有各種發行版如 Ubuntu、CentOS 等。

這些系統有各自的內核,出於系統穩定性考慮是不允許用戶程序直接操作內核,同時也將內核開發和應用軟件開發隔離開來,系統將必要的函數封裝成庫供應用軟件調用,約定的規范即為應用軟件接口 (Application Program Interface,API)。

img

軟件系統層級關系簡要示意圖

API 函數庫是連接用戶軟件和系統內核橋梁,或者是 “協議”,操作系統廠商寫好函數庫說明書,應用軟件開發者不必關心其內部是如何實現的,用的時候對照着 API 手冊查詢就夠了;應用軟件也可以越過系統函數庫通過 system call(系統調用)直接調用 os 內核函數,如圖中紅色虛線所示,當然這種方式並不被推薦。

如果各系統平台都能提供相同的系統函數庫,那么開發者在這個系統函數庫基礎之上編寫軟件代碼,那么就很容易將軟件移植到各個系統平台。然而,這只是個美好的願望,IEEE 就是為了達成這樣的願望才牽頭制定 POSIX 標准。POSIX 標准主要就是針對 UNIX API 而制訂,不管函數如何包裝、功能如何實現,但 API 按照標准約定來(比如函數變量等符號名稱、數據結構、參數類型與個數、基本工具命令名稱等),Linux 完全兼容 POSIX 標准(部分函數符合 POSIX,部分函數是 Linux 專有,即是 POSIX 的超集),微軟聲稱 Windows 部分兼容 POSIX 標准。

主流 os 內核通常是 C 語言寫成,系統函數庫通常以一個或多個鏈接庫文件的形式提供,其中最重要的是 C 標准庫,其他的鏈接庫往往調用 C 標准庫而實現,當然也可能直接調用系統內核函數,甚至混合。不同系統平台有多種主流的 C 標准庫共存:

  • BSD libc,由 BSD 系統發布;
  • GNU C Library (glibc),由 GNU 項目發布,可在 Linux、多種 UNIX 系統上運行;
  • Microsoft C run-time library(MSVCRT.DLL),由微軟隨 Windows 發布,給 Visual C++ 編輯器鏈接使用的;
  • Newlib,由 Cygnus Solution 公司開發,Cygwin 環境中的 libc.a 正是此版本,目前廣泛用在嵌入式系統中;
  • dietlibcμClibc 等,功能經過適度裁剪的 C 標准庫,主要用在嵌入式系統。

Cygwin 的組成

先輩 David Wheeler 大神曾經曰過:

“All problems in computer science can be solved by another level of indirection(計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決)”。

img

David Wheeler ( 圖片來源:https://en.wikipedia.org/wiki/David_Wheeler_(computer_scientist)

就如同上圖,在硬件基礎之上逐步堆疊了系統內核、系統函數庫等中間層,在應用程序內部還可以繼續細分多個層次,這樣把最終用戶與硬件隔離開來,增強了抽象能力、屏蔽底層細節,也讓開發者分工,專注於各自層次的開發,同時降低了軟件遷移的難度。

Cygwin 就是在 Windows 中增加了一個中間層——兼容 POSIX 的模擬層,並在此基礎上構建了大量 Linux-like 的軟件工具。再來解釋本文開頭的回答,如下圖,POSXI 兼容環境包括以下兩部分:

  • cygwin1.dll,作為實現 POSIX 系統調用的模擬層,可原生運行在 Windows 中;
  • 在 cygwin1.dll 之上構建的大量函數庫、應用程序,如 libc、zlib、bash、gcc、vim、awk、sed、git 等等,與 UNIX/Linux 幾乎等同 *。

** 注:Cygwin 的 libc 是 Newlib,Linux 的 libc 是 GNU libc,UNIX 有的是 BSD libc。*

img

Cygwin 環境層次簡要示意圖

Cygwin API 首先盡可能地遵從 Single Unix Specification V3(2018 版),這個標准內容同時也是 POSIX.1 和 IEEE Std 1003.1 的標准內容,由 Open Group 和 IEEE 共同制定,最新已更新到 V4(2018 版),其次再盡可能地遵從 Linux 最佳實踐。Cygwin API 中還有些是 Cygwin 獨有的,在 POSIX 中並未涉及。

Cygwin 將 cygwin1.dll、函數庫、應用程序等文件按照 UNIX/Linux 的目錄樹架構進行組織存放,如 / bin、/usr、/lib、/etc、/var、/home 等等都存在於 Cygwin 安裝路徑下,用戶從終端登陸進 Cygwin 的 shell 后,就可以像在 UNIX/Linux 系統那樣使用相同的命令、工具,隨着開發工作推進,越來越多的 GNU、UNIX、Linux 軟件都移植到了 Cygwin 中。不僅如此,甚至像 X Server、Gnome/KDE 桌面環境等都移植到了 Cygwin 中,UNIX/Linux 系統中的圖形界面軟件也能使用。

Cygwin 的優點

  • 首先自然是近乎一致的 UNIX/Linux 體驗;
  • 完備且相對輕量,普通用戶不必安裝整個 Linux 系統或虛擬機,就可以獲得近乎一致的體驗,Cygwin 的程序運行與 Windows 互不干擾,高效的命令行工具與 Windows 圖形界面各有所長、形成互補;
  • 開源免費,cygwin1.dll 本身是按照 GPLv3 協議發布的,其他的應用程序有 GPL、LGPL、X11 等多種協議;
  • 安裝卸載方便,Cygwin 提供了包管理工具,可按需安裝 / 卸載軟件包,一個能運行起來的最小 Cygwin 系統只需要幾十上百 MB,而完全的 Cygwin 系統需要幾十 GB;
  • 源碼級兼容性,GNU、UNIX、Linux 軟件的源代碼幾乎不用修改就可以在 Cygwin 環境中編譯構建成功;
  • 與 Windows 互操作,Cygwin 把 Windows 的磁盤掛載到 / cygdrive 下,如 c 盤就是 / cygdrive/c、d 盤就是 / cygdrive/d,Cygwin 中的應用程序可以讀寫 Windows 磁盤中的文件,Windows 應用程序也可以讀寫 Cygwin 目錄中的文件(但要注意不要把文件搞亂了);Cygwin 的 shell 中可以啟動 Windows 程序,Windows 的 cmd 中也可以啟動 Cygwin 的程序,但由於字符編碼不同可能造成亂碼;
  • 多一套可用的 API,對於 Windows 開發者,程序代碼既可以調用 Win32 API,又可以調用 Cygwin API,甚至混合。

Cygwin 的不足

  • 效率相對低,由於是在 Win32 系統之上模擬實現 POSIX 兼容層,應用程序在底層就多了一個層級的函數調用,效率比 UNIX/Linux 系統上原生的應用程序肯定低,不過這也是在效率和兼容性之間選擇的一個平衡;
  • 未實現二進制文件級別的兼容,Cygwin 系統上的應用程序編譯后仍然是 Windows PE 格式的可執行文件,UNIX/Linux 系統上的二進制可執行文件在 Cygwin 上不能運行
  • 與 Windows 互操作不足,Windows 原生程序並不能利用 cygwin1.dll 提供的與 UNIX/Linux 兼容的信號、pty 設備等,除非改寫程序代碼重新編譯,但這樣新的程序就依賴於 cygwin1.dll,就不是 “Windows 原生程序” 了。

Cygwin 常見應用場景

Cygwin 可資利用的是已經移植的大量 GNU、UNIX、Linux 軟件和兼容 POSIX 的模擬層,其使用場合也就是針對這兩點。

img

高效命令行工具 (圖片來源於網絡)

常見的應用場合包括但不限於:

(1)Shell 命令行使用

Shell 是 UNIX/Linux 的精華所在,骨灰級玩家可以做到不用鼠標只敲命令完成所有工作,用戶最常用的大量命令在 Cygwin 下均可照常使用,在 UNIX/Linux 編寫的腳本也可以幾乎不加修改地在 Cygwin 下運行。例如安卓廚房本是在 Linux-like 環境下運行的腳本集合,用於修改安卓系統固件包,有了 Cygwin,Windows 用戶也可以拿來修改安卓系統固件包。高效的命令行工具與 Windows 圖形界面各有所長、形成互補。

(2)交叉編譯構建環境搭建

Cygwin 環境中已移植好了 gcc 等開發工具,大量的交叉工具鏈(如 arm-none-gnu-eabi-gcc、arm-none-gnu-eabi-binutils)也可以在 Cygwin 中制作,就算只有 Windows 原生版本的,Cygwin shell 中也能調用,那么利用 Cygwin 就能搭建起交叉編譯構建環境;另外,使用 Cygwin API,編寫代碼以及后續編譯構建過程,與在 UNIX/Linux 中差異也很小了。

(3)程序移植

把符合 POSIX 標准的程序移植到 Windows 下,還有更多正在由個人、社區、商業公司、研究機構不斷貢獻的開源自由軟件,造福廣大 Windows 用戶,利用已有的 GNU、UNIX、Linux 軟件會使程序移植越來越容易。這一點不多說。

(4)兼用 POSIX API 和 Win32 API 開發

有的開發者可能對 UNIX/Linux 和 Win32 的 API 都熟悉,兩套 API 也各有其優點,在 Cygwin 下開發者自己可以任意選取、混合使用。

參考

更多閱讀

上一篇 silaoA:Cygwin 前傳:從割據到互補zhuanlan.zhihu.com圖標

下一篇 Cygwin 系列(二):初窺 Cygwin 背后zhuanlan.zhihu.com圖標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM