简介

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. LeetCode 257. Binary Tree Paths(二叉树根到叶子的全部路径)

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  2. c# Mono.Cecil IL方式 读MethodBody

    using Kufen.Common.Definitions; using Mono.Cecil; using System; using System.Collections.Generic; us ...

  3. 从原理到应用,Elasticsearch详解

    简介 Elasticsearch(简称ES)是一个分布式.可扩展.实时的搜索与数据分析引擎.ES不仅仅只是全文搜索,还支持结构化搜索.数据分析.复杂的语言处理.地理位置和对象间关联关系等. ES的底层 ...

  4. 使用全备+binlog日志恢复数据库

    1.binlog日志类型 Statement 只记录执行的sql语句,磁盘占用少,但是恢复的时候容易出问题.InodeDB不能使用Statement . Row 记录修改后的具体数据,磁盘占用较多 M ...

  5. VS2015 控制台cl编译器全局环境变量配置

    Visual C++的cl.exe编译器是微软推出的编译器 为了可以在CMD里使用cl.exe手工执行编译操作 设置环境变量 PATH C:\Program Files (x86)\Microsoft ...

  6. Redis解决“重试次数”场景的实现思路

    很多地方都要用到重试次数限制,不然就会被暴力破解.比如登录密码. 下面不是完整代码,只是伪代码,提供一个思路. 第一种(先声明,这样写有个bug) import java.text.MessageFo ...

  7. 【Python爬虫案例学习】分析Ajax请求并抓取今日头条街拍图片

    1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. from urllib.parse import urlencode from requests.excep ...

  8. 不会前后端,用vps搭建个人博客(二)

    <接上一篇>   四.添加网页内容 1.下载安装WordPress 输入以下命令: wget https://wordpress.org/latest.tar.gz 当然你也可以用浏览器进 ...

  9. HTML登录注册页面简单实现

    github:传送门 , 码云: 传送门 效果参考: 登录页面,注册页面 使用了bootstrap,jQuery. 后端使用的CGI处理表单,存入MySQL数据库.(之后更新) 登录页面源码 < ...

  10. EasyExcel读取文件-同步处理数据

    读取代码 // 前端传过来的文件 MultipartFile file; InputStream inputStream = file.getInputStream(); // 读取excel数据,边 ...