WSL提供了一個微軟開發的Linux兼容核心接口(不包含Linux代碼),來自Ubuntu的用戶模式二進制檔案在其上運行。
該子系統不能運行所有Linux軟體,例如那些圖形用戶界面,以及那些需要未實現的Linux核心服務的軟體。不過,這可以用在外部X伺服器上運行的圖形X Window系統緩解。
此子系統起源於命運多舛的Astoria項目,其目的是允許Android套用運行在Windows 10 Mobile上。[5]此功能組件從Windows 10 Insider Preview build 14316開始可用。
歷史
在設計之初,微軟就允許類似於Win32這種子系統運行於windows NT核心之上,它可以為上層套用提供編程接口,同時避免套用去實現核心里的一些調用細節。NT核心的設計在最開始就可以支持POSIX,OS/2和win32子系統。
早先的子系統是用戶態模組的實現,它封裝了NT系統的系統調用為應用程式提供編程接口。所有的應用程式都是PE/COFF(一些為子系統封裝NT系統調用的庫和服務)可執行的。當一個用戶態的程式啟動的時候,啟動器就會基於可執行的頭部去引用適當的子系統來滿足應用程式的依賴。
後來版本的子系統替換掉了POSIX層,由用戶態組件提供了Subsystem for Unix-based Applications (SUA),滿足:
1. 進程和信號管理
2. 終端管理
3. 系統服務請求和進程間通信
SUA的主要目的是為了鼓勵應用程式移植到Windows上能儘量少的重寫。這已經通過實現POSIX用戶態API達到了。考慮到這些組件是用戶態實現,很難跟核心態的系統調用(比如fork())在語義上和效率上完全相對應。因為這種模式需要程式重新編譯,它需要持續的功能移植,維護也是負擔。
隨著時間的演變,這些早先的子系統都退出歷史舞台了。但是因為WIndows NT核心的架構允許新的子系統環境,我們就基於這領域的原始積累進行擴展,發展Windows Subsystem for Linux。
包含內容
Windows Subsystem for Linux
WSL是一些組件的集合,允許原生的Linux ELF64二進制檔案跑在Windows上。它同時包括了用戶態和核心態組件,主要包含以下部分:
1. 用戶態會話管理服務處理Linux實例的生命周期
2. Pico provider drivers (lxss.sys, lxcore.sys)“翻譯”系統調用,以模擬Linux核心
3. Pico 進程管理原生的用戶態Linux(比如/bin/bash)
奇蹟就發生於用戶態的Linux二進制檔案和Windows核心組件之間。通過將未經修改的Linux二進制檔案放置於Pico進程中,我們把Linux系統調用直接導入Windows核心中。lxss.sys, lxcore.sys驅動將Linux系統調用翻譯為NT APIs,來模擬Linux核心。
Pico進程
作為Project Drawbridge的一部分,Windows核心引入了Pico進程和Pico驅動的概念。Pico進程和驅動提供了Windows Subsystem for Linux的基礎。可執行的ELF二進制檔案被載入到Pico進程的地址空間,並在系統調用的Linux兼容層上執行。
系統調用
WSL基於Windows NT核心虛擬了Linux核心接口,這允許它執行未經修改的Linux ELF64二進制檔案。一類核心接口是系統調用。系統調用是核心為用戶態程式提供的一種服務。Linux核心和Windows NT核心都為用戶態程式提供了幾百個系統調用,但是他們有不同的語義,並且一般來說並不直接兼容。比如Linux提供fork, open和kill,Windows NT提供相兼容NtCreateProcess, NtOpenFile和 NtTerminateProcess。
Windows Subsystem for Linux 包含核心態驅動(lxss.sys和 lxcore.sys),以協調Linux系統調用的請求與Windows NT核心。驅動不包含Linux核心代碼,但是是一個全新實現的Linux兼容的核心接口。在原生的Linux上,用戶態程式請求一個系統調用,系統調用請求由Linux核心處理。在WSL,當一個系統調用由同一個執行檔請求時,Windows NT核心把請求傳送給lxcore.sys。 當可能時,lxcore.sys將Linux系統調用翻譯成等價的Windows NT的調用,由它來完成繁重的工作。當沒有可能的等價轉換時,Windows核心態驅動需要直接處理請求。
比如說,Linux中的fork()系統調用沒有直接的等價的windows版本。當一個fork系統調用由Windows Subsystem for Linux產生時,lxcore.sys需要做一些複製進程的準備工作,然後調用Windows NT核心APIs來產生一個進程來正確實現fork操作,完成為新進程複製額外的數據。
檔案系統
WSL支持的檔案系統需要滿足兩個目標。
1. 提供一個完全支持Linux檔案系統的環境
2. 能夠與Windows上的設備和檔案互通
Windows Subsystem for Linuxt提供與真實Linux核心類似的虛擬檔案系統。在用戶的系統上,我們提供了兩個檔案系統:VolFs 和 DriveFs。
VolFs
VolFs提供了完整的Linux檔案系統特性的支持,包括:
1. Linux許可權管理,訪問許可權可以通過如chmod和chroot來改變
2. 檔案的符號連結
3. 檔案名稱可以包含一些Windows上不合法的符號
4. 大小寫敏感
包含Linux系統的目錄,應用程式檔案(/etc, /bin, /usr等)和用戶Linux家目錄都使用的是VolFs。
與Windows套用和檔案的互用在VolFs里並不支持。
DriveFs
DriveFs是為了和windows互用的檔案系統。它需要所有的檔案名稱是合法的windows檔案名稱,使用Windows安全策略,並不完整地支持所有的Linux檔案系統特性。檔案名稱是大小寫敏感的,用戶不允許創建僅僅是大小寫不同的兩個檔案。
所有的Windows磁碟使用DriveFs被掛在到/mnt/,/mnt/d等等下面。用戶從這裡可以訪問所有Window下的檔案。這允許用戶用他們喜歡的Windows編輯器比如Visual StudioCode來編輯檔案的同時,通過Bash里的一些開源工具來修改檔案。