简介

WSL,是Windows Subsystem for Linux的缩写,字面意义上理解就是WIndows下的Linux子系统。WSL 由Microsoft Windows内核团队创建,目前如果最为学习Linux使用的化已经支持的相当好了。WSL现已被集成到WIndows 10中,如果想要使用该功能需要单独打开并重启。

WSL使用了一个subsystem的概念,传统上我们认为Linux程序无法在Windows上运行,因为两者可执行文件标准是不同的(ELF和Win32)。但事实上这是个误区,WIndows NT设计之初就支持多种subsystem,那是NT内核实际上提供了Linux程序需要的接口,只是针对Win32程序时屏蔽了这些接口。至于为啥没流行起来,我猜测可能是性能问题。

传统上大多数人学习Linux都是在物理机上安装WMware Workstation,然后再Host上安装Linux虚拟机。又或者在物理机上安装双系统,无论哪一种方式都非常麻烦。以WMware Workstation为例,WSL的出现估计会对其在桌面市场的份额造成不小影响。WMware Workstation其实现原理是作为WIndows的应用层,WSL的支持是在NT内核中单独有个driver来处理Linux的系统调用,相比较WMware Workstation的做法无论在资源占用上,还是与系统契合度上,WSL都要更好一些。

但是WMware Workstation也不是就没用了,他除了虚拟Linux还可以虚拟Windows,在一个物理机上装2个甚至多个Windows,目前来看你还只能使用WMware Workstation。注意:我这里涉及到的场景大多数人学习时使用的场景,向云计算或者虚拟化场景中这些都不是问题。

WSL最开始的名字是Bash on [Ubuntu on] Windows,字面意义上理解就是在WIndows下可以使用bash。起这个名字MS也是希望用户尽快理解并适应这么个新生事物(其实也不算,NT原本就支持)。随着更多的功能、特性被加进来,Bash on [Ubuntu on] Windows更名为WSL,更多的意义是向用户传达MS这一侧使用何种技术来实现Linux原生程序运行在Windows下。

你可能会有疑问,WSL是发行版吗?WSL是VM吗?

答案都是否定的。上面那幅图你开启支持WSL后,WSL会伴随Windows 10一直运行而运行,WSL本质是上是系统层面对Linux内核进行支持,NT内核中为了实现对Linux的支持,也没有放入一个完整的Linux内核,而是LXCore、LXSS充当driver。

WSL引入Windows时间并不长,但是发展速度很快,越来越多的特性也得到了支持。想到这总让我有种似曾相识的感觉,当年GNU在Unix上开发了各种实用软件,可惜一直没有自己的内核,直到Linux出现了。经过多年发展,Linux平台上有了更多更好的工具,很多甚至是Linux独占。WSL的做法很想当年Linux内核接过GNU为Unix开发的实用工具自己发展壮大一样,未来谁知道呢,不过这一次,MS干得漂亮!

History of Windows Subsystems

Windows NT自成立以来,便支持多environment subsystems(eg. POSIX, OS/2 and Win32 subsystems)。以Win32 subsystems为例,Win32 subsystems向应用程序提供编程接口(programmatic interface),使上层应用不必依赖于内核实现细节。

早期的subsystems是以用户模式实现的,在上层应用与Windows NT内核之间“拉皮条”。将上层应用的API请求转换成对内核的系统调用。所有的应用程序都是PE/COFF可执行文件,或者作为库、服务。他们实现了subsystems像外“暴漏”API。当用户空间可执行文件启动时,loader会根据其header信息调用正确的subsystems来满足该可执行程序的环境、依赖等资源。后来POSIX这个subsystems被SUA(Subsystem for Unix-based Applications)替换,SUA由若干用户模式组件(user mode components)构成,包括:

    1. Process and signal management
    2. Terminal management
    3. System service requests and inter process communication

SUA的组要作用是鼓励应用程序在没有重大重写的情况下移植到Windows。其实现原理是:使用NT构造实现POSIX用户模式API。但是这有个弊端,由于这些组件(components)运行在用户模式下,原本针对Linux开发的应用程序,NT下很难为应用程序中那些系统调用实现优化或者加速,比如fork()。

随着时间的推移,最初的subsystems逐渐退役,但是Windows NT架构允许新的subsystems,因此可以在这个领域扩展或增强subsystems来满足需要,WSL就是这么诞生的。

Windows Subsystem for Linux

WSL是一堆组件的集合,他们协同工作,最终让你在Windows上运行原生Linux ELF64 二进制文件。WSL包括用户模式组件、内核模式组件,其职责:

  1. User mode session manager service that handles the Linux instance life cycle
  2. Pico provider drivers (lxss.sys, lxcore.sys) that emulate a Linux kernel by translating Linux syscalls
  3. Pico processes that host the unmodified user mode Linux (e.g. /bin/bash)

It is the space between the user mode Linux binaries and the Windows kernel components where the magic happens. By placing unmodified Linux binaries in Pico processes we enable Linux system calls to be directed into the Windows kernel. The lxss.sys and lxcore.sys drivers translate the Linux system calls into NT APIs and emulate the Linux kernel.

Windows Subsystem for Linux: Architectural Overview

Windows Subsystem for Linux: Process Architecture

Windows Subsystem for Linux - Syscall Translation

Windows Subsystem for Linux: File System

Windows Subsystem for Linux: Windows and Ubuntu Interoperability

WSL quick overview的更多相关文章

  1. A quick tour of JSON libraries in Scala

    A quick tour of JSON libraries in Scala Update (18.11.2015): added spray-json-shapeless libraryUpdat ...

  2. Windows Automation API 3.0 Overview

    https://www.codemag.com/article/0810042 While general accessibility requirements (such as font color ...

  3. 【HBase】HBase Getting Started(HBase 入门指南)

    入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...

  4. Windows And Video Memory

    MSDN Blogs > Zemblanity > Windows And Video Memory   Windows And Video Memory Tom_Mulcahy 11 F ...

  5. 使用SharePoint 2010 母版页

    SharePoint 2010母版页所用的还是ASP.NET 2.0中的技术.通过该功能,实现了页面框架布局与实际内容的分离.虽然在本质上自定义母版页的过程和以前版本的SharePoint大致相同,但 ...

  6. 20 个值得一试的JavaScript 框架

      投递人 itwriter 发布于 2011-09-26 17:46 评论(3) 有1956人阅读 原文链接 [收藏] « » 本文介绍 20 个值得一试的 JavaScript 框架,如果你认为答 ...

  7. Training Deep Neural Networks

    http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html  //转载于 Training Deep Neural ...

  8. Solr官方文档翻译-About & Getting Started

    关于(About) 官方文档介绍了所有的Apache Solr实现的重要特性和功能.它是免费的,可以到http://lucene.apache.org/solr/下载. 为了更加的深入和广泛,设计成一 ...

  9. JavaScript闭包的底层运行机制

    转自:http://blog.leapoahead.com/2015/09/15/js-closure/ 我研究JavaScript闭包(closure)已经有一段时间了.我之前只是学会了如何使用它们 ...

随机推荐

  1. Python中,我该如何切分字符串后保留分割符?

    原文来源:https://stackoverflow.com/questions/2136556/in-python-how-do-i-split-a-string-and-keep-the-sepa ...

  2. VC++6.0 打印调试信息

    1.在MFC中加入TRACE语句 2.在TOOLS->MFC TRACER中选择 “ENABLE TRACING”点击OK 3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能 ...

  3. (CSDN 迁移) JAVA多线程实现-可回收缓存线程池(newCachedThreadPool)

    在前两篇博客中介绍了单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).下面介绍的是第三种newCachedThreadPo ...

  4. CentOS7开机进入紧急模式EmergencyMode的解决办法

    这个情况主要是 修改了 /etc/fstab 文件 vi /etc/fstab 文件 如果之前添加过一行 把添加的一行注释掉 如果之前没有添加过,把挂载到 /home 这一行取消注释 操作之后 记得 ...

  5. PHP防止被重复请求接口的方法(网页端签名验证的方法)

    PHP防止被重复请求接口的方法(网页端签名验证的方法) 可以采取签名验证的方式来 解决这个问题 1 time和随机数都是PHP生成的显示在前端 2 前端生成sign 3 进行每次请求的sign计数 这 ...

  6. Java实现RSA加密&AES加密&DES加密

    RSA package com.demo; import org.springframework.util.StringUtils; import javax.crypto.Cipher; impor ...

  7. webStrom中React语法提示,React语法报错处理

    1,webStrom中React语法报错 ①, 取消Power Save Mode的勾选 File——Power Save Mode ②,webstorm开发react-native智能提示 随便在一 ...

  8. 【C语言】崩溃的双重指针

    指针的指针? 前言: 指针的初识点击移步 双重指针: 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二 ...

  9. golang在linux下的安装操作

  10. ubuntu 安装和配置 GitLab

    一.概述 GitLab 是一个基于 Web 的开源 Git 软件仓库管理器,用 Ruby 编写,包括 wiki,问题管理,代码审查,监控以及持续集成和部署.它使开发人员能够创建,审查和部署他们的项目. ...