Windows Linux子系統

原文鏈接:https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/

  我們最近宣佈了Windows平臺上的Ubuntu上的Bash,它使本機Linux ELF64二進制文件可以通過Windows Linux子系統(WSL)在Windows上運行。該子系統是由Microsoft Windows內核團隊創建的,並引起了很多興奮。我們被問到的最常見問題之一是這種方法與傳統虛擬機有何不同。在系列博客文章的第一篇中,我們將概述WSL,它將回答該問題和其他常見問題。在以後的文章中,我們將深入介紹所介紹的組成部分。代表Deepu Thomas發表。
  
  Windows子系統的歷史自成立以來,Microsoft Windows NT旨在允許Win32之類的環境子系統嚮應用程序提供程序化接口,而無需與內核內部的實現細節聯繫在一起。這使得NT內核在其初始版本中支持POSIX,OS / 2和Win32子系統。
  
  早期的子系統被實現爲用戶模式模塊,這些模塊根據提供給該子系統應用程序的API發出適當的NT系統調用。所有應用程序都是PE / COFF可執行文件,是一組用於實現子系統API的庫和服務,以及用於執行NT系統調用的NTDLL。當啓動用戶模式應用程序時,加載程序會基於可執行標頭調用正確的子系統來滿足應用程序依賴性。
  
  子系統的更高版本替換了POSIX層,以提供基於Unix的應用程序(SUA)的子系統。它由滿足以下要求的用戶模式組件組成:
  1、進程和信號管理
  2、終端管理
  3、系統服務請求和進程間通信
  
  SUA的主要作用是鼓勵應用程序移植到Windows而無需大量重寫。這是通過使用NT構造實現POSIX用戶模式API來實現的。鑑於這些組件是在用戶模式下構造的,因此對於內核模式系統調用(如fork())很難具有語義和性能奇偶性。由於此模型依賴於需要重新編譯程序的需求,因此需要持續進行功能移植並且是維護負擔。
  
  隨着時間的流逝,這些最初的子系統被淘汰了。但是,由於Windows NT內核是爲允許新的子系統環境而設計的,因此我們能夠使用在該領域進行的最初投資並擴大它們來開發Linux的Windows子系統。
  
  Windows Linux子系統
  
  適用於Linux的Windows子系統WSL是使本機Linux ELF64二進制文件能夠在Windows上運行的組件的集合。它包含用戶模式和內核模式組件。它主要包括:
  1、處理Linux實例生命週期的用戶模式會話管理器服務
  2、Pico提供程序驅動程序(lxss.sys,lxcore.sys)通過轉換Linux syscalls託管未修改的用戶模式Linux的
  3、Pico進程來模擬Linux內核(例如/ bin / bash)
  用戶模式Linux二進制文件和Windows內核組件之間的空間就是神奇的地方。 通過在Pico進程中放置未修改的Linux二進制文件,我們使Linux系統調用可以定向到Windows內核。 lxss.sys和lxcore.sys驅動程序將Linux系統調用轉換爲NT API,並模擬Linux內核。
在這裏插入圖片描述

LXSS Manager服務
LXSS Manager服務是Linux子系統驅動程序的代理,也是Bash.exe調用Linux二進制文件的方式。 該服務還用於安裝和卸載周圍的同步,一次僅允許一個進程執行這些操作,並在操作掛起時阻止啓動Linux二進制文件。

特定用戶啓動的所有Linux進程都進入Linux實例。 該實例是一個數據結構,可跟蹤所有LX進程,線程和運行時狀態。 NT進程第一次請求啓動Linux二進制文件時,將創建一個實例。

最後一個NT客戶端關閉後,Linux實例將終止。 這包括在實例內部啓動的所有進程,包括守護程序(例如git憑據緩存)。

Pico進程
作爲Project Drawbridge的一部分,Windows內核引入了Pico進程和Pico驅動程序的概念。 Pico進程是OS進程,不存在與諸如Win32 Process Environment Block(PEB)之類的子系統相關的OS服務的陷阱。 此外,對於Pico進程,系統調用和用戶模式異常將分派給配對的驅動程序。

Pico進程和驅動程序爲Linux子系統提供了基礎,該Windows子系統通過將可執行的ELF二進制文件加載到Pico進程的地址空間中並在與Linux兼容的syscall層上執行來運行本機未修改的Linux二進制文件。

系統調用
WSL通過虛擬化Windows NT內核之上的Linux內核接口來執行未修改的Linux ELF64二進制文件。它公開的內核接口之一是系統調用(syscalls)。 syscall是內核提供的一項服務,可以從用戶模式下調用。 Linux內核和Windows NT內核都向用戶模式公開了數百個syscall,但是它們具有不同的語義,通常不直接兼容。例如,Linux內核包括fork,open和kill之類的東西,而Windows NT內核具有類似的NtCreateProcess,NtOpenFile和NtTerminateProcess。

Windows Linux子系統包括內核模式驅動程序(lxss.sys和lxcore.sys),這些驅動程序負責與Windows NT內核協同處理Linux系統調用請求。驅動程序不包含Linux內核中的代碼,而是Linux兼容內核接口的無塵室實現。在本機Linux上,當從用戶模式可執行文件進行syscall時,它由Linux內核處理。在WSL上,當從同一可執行文件進行系統調用時,Windows NT內核會將請求轉發到lxcore.sys。在可能的情況下,lxcore.sys會將Linux syscall轉換爲等效的Windows NT調用,這又會導致繁重的工作。如果沒有合理的映射,則Windows內核模式驅動程序必須直接爲請求提供服務。

例如,Linux fork()syscall沒有針對Windows記錄的直接等效調用。當對Linux的Windows子系統進行fork系統調用時,lxcore.sys會執行一些初始工作來爲複製進程做準備。然後,它將調用內部Windows NT內核API,以使用正確的語義創建進程,並完成爲新進程複製其他數據的操作。

文件系統
WSL中的文件系統支持旨在滿足兩個目標。

提供支持Linux文件系統的完整保真度的環境
允許與Windows中的驅動器和文件互操作
適用於Linux的Windows子系統提供了類似於真實Linux內核的虛擬文件系統支持。兩個文件系統用於提供對用戶系統上文件的訪問:VolF和DriveF。

VolFs
VolFs是一個文件系統,它完全支持Linux文件系統功能,其中包括:

可以通過諸如chmod和chroot之類的操作來修改Linux權限
指向其他文件的符號鏈接
Windows文件名中通常不包含字符的文件名
區分大小寫
包含Linux系統,應用程序文件(/ etc,/ bin,/ usr等)和用戶Linux主目錄的目錄均使用VolF。

不支持Windows應用程序與VolF中的文件之間的互操作性。

驅動器
DriveFs是用於與Windows互操作的文件系統。它要求所有文件名均爲合法的Windows文件名,使用Windows安全性,並且不支持Linux文件系統的所有功能。文件區分大小寫,用戶不能創建名稱僅按大小寫不同的文件。

使用DriveF將所有固定的Windows卷安裝在/ mnt / c,/ mnt / d等下。用戶可以在這裏訪問所有Windows文件。這使用戶可以使用自己喜歡的Windows編輯器(例如Visual Studio Code)來編輯文件,並同時使用WSL在Bash中使用開源工具來操作它們。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章