WSL quick overview
简介
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)构成,包括:
- Process and signal management
- Terminal management
- 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包括用户模式组件、内核模式组件,其职责:
- User mode session manager service that handles the Linux instance life cycle
- Pico provider drivers (lxss.sys, lxcore.sys) that emulate a Linux kernel by translating Linux syscalls
- 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的更多相关文章
- 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 ...
- Windows Automation API 3.0 Overview
https://www.codemag.com/article/0810042 While general accessibility requirements (such as font color ...
- 【HBase】HBase Getting Started(HBase 入门指南)
入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...
- Windows And Video Memory
MSDN Blogs > Zemblanity > Windows And Video Memory Windows And Video Memory Tom_Mulcahy 11 F ...
- 使用SharePoint 2010 母版页
SharePoint 2010母版页所用的还是ASP.NET 2.0中的技术.通过该功能,实现了页面框架布局与实际内容的分离.虽然在本质上自定义母版页的过程和以前版本的SharePoint大致相同,但 ...
- 20 个值得一试的JavaScript 框架
投递人 itwriter 发布于 2011-09-26 17:46 评论(3) 有1956人阅读 原文链接 [收藏] « » 本文介绍 20 个值得一试的 JavaScript 框架,如果你认为答 ...
- Training Deep Neural Networks
http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html //转载于 Training Deep Neural ...
- Solr官方文档翻译-About & Getting Started
关于(About) 官方文档介绍了所有的Apache Solr实现的重要特性和功能.它是免费的,可以到http://lucene.apache.org/solr/下载. 为了更加的深入和广泛,设计成一 ...
- JavaScript闭包的底层运行机制
转自:http://blog.leapoahead.com/2015/09/15/js-closure/ 我研究JavaScript闭包(closure)已经有一段时间了.我之前只是学会了如何使用它们 ...
随机推荐
- 使用pprof调试go程序
使用pprof调试go程序 pprof可以用来调试go程序,在go中有两个库可以使用,1. net/http/pprof 2. runtime/pprof 方法1 - net/http/pprof 测 ...
- vue脚手架中使用Vant,实现自动按需引入组件,并将px转换为rem
偶然间看到一款不错的移动端vue组件库Vant,照着官方文档敲了一下,感觉还是不错的.想着以后的项目中可能会运用到,特此记录下,方便之后使用. 现在很多的组件库为了减小代码包体积,都支持按需加载了.V ...
- mvn-dependencies-vs-dependencyManagement
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖. dependencies 相对于dependencyManagement,所有声明在dep ...
- K3Wise插件开发实战教程(全套)持续更新中。。。
这是林枫山自己编写制作的全套K3wise插件教程,欢迎下载学习. 下载目录链接如下(如果链接下载不了,请加QQ:714259796获取教程): 进度01-K3Wise数据表详解 下载学习文档 ...
- Python窗体操作函数
实现了一个window下对窗体操作的类,实现的功能如:移动窗体.获取窗体位置和大小.截取窗体图片.坐标转换等. 直接上代码: # coding=utf-8 import win32con import ...
- mysql 导入txt数据到数据表【原创】
1.如何将数据表导入到mysql的表中,可以使用:load data infile ... into table ... 示例: load data infile 'e:\datainfo.txt' ...
- python/shell代码片段
查看某模块路径 Bash pip show --files selenium 文件编码转换 Bash convmv -f GBK -t UTF-8 --notest -r ydcz_1/ 查找当前目录 ...
- JVM的基本结构和JVM的内存结构
这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...
- [转帖]Java中重写和重载与多态的关系
Java中重写和重载与多态的关系 2019-09-05 00:57:41 留下一天今天 阅读数 67 收藏 更多 分类专栏: java进阶之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- c语言 判断字符串长度 实现
/* 首先明白答案的本质(该函数)是一个计数器该计数器用for循环来实现实现对一串字符串的计数字符串以空格开头 不计算空格 计算空格后的数字直到遇到\0结束.num计算器字符串不以空格结束 计算空格后 ...