FCon7折倒计时最后一周:日程已上线70%!查看详情>>> 了解详情
写点什么

Windows 原生运行 Linux 的技术细节

  • 2016-05-02
  • 本文字数:1940 字

    阅读完需:约 6 分钟

Microsoft 最近宣布了将Linux Bash 与Windows 10 进行集成的意图,通过这种集成,Windows 10 用户将能在操作系统中原生运行Linux ELF64 二进制程序。为避免对该技术的实现方法产生错误的猜测,Windows Subsystem for Linux 团队主管Deepu Thomas 详细介绍了在Windows 上运行Linux 的技术细节。

为了解释在Windows 上运行Linux 的方法,首先需要介绍一些相关技术和功能:

Windows 用户模式。是 CPU 的一种运行模式,可对普通应用程序进行隔离和保护。每个以这种模式启动的应用程序都有自己专用、无法被其他应用程序修改的虚拟地址空间。此外如果一个应用程序崩溃,其他应用程序不会受到波及。

Windows 内核模式。主要由(内核模式的)驱动程序之类的操作系统核心组件使用的一种 CPU 运行模式。与计算机硬件进行的所有交互都是在这种模式下处理的。为尽可能避免崩溃,Windows 内建并以该模式运行的组件需要进行全面的测试,因为这种层面的崩溃会危及整个操作系统。这篇MSDN 文章详细介绍了这两种Windows 模式之间的差异。

Windows NT 子系统。Windows NT 问世之初就在应用程序所能调用的 API 和内核层之间进行了隔离。这样 Windows NT 便可支持多种子系统,例如 POSIX、OS/2 以及 Win32。这些子系统最初的用途是简化 UNIX 和 OS/2 应用程序向 Windows 移植的工作。虽然 POSIX 和 OS/2 子系统已被取消,但它们的架构依然保留了下来。

Pico 进程和驱动 DrawBridge 项目引入的 Pico 进程和相应的驱动提供了一种基于过程的容器。这是一种不包含操作系统服务的轻量级解决方案,系统调用是由一对 Pico 驱动处理的。

用户模式 Linux。通过这种方式可将 Linux 作为应用程序在其他 Linux 宿主机基础之上运行。此时来宾 Linux 内核无需直接访问硬件,而是将系统调用转发至宿主机 Linux,由其代为访问。

为了运行 Linux,Microsoft 创建了Windows Subsystem for Linux (WSL),这个子系统的整体架构如下图所示:

当用户以用户模式启动 bash.exe 时,会同时启动相关服务以及 LX 会话管理器。这个服务在用户通过命令提示符输入的 bash 命令和待执行的相关原生 ELF64 二进制程序之间承担了中介的角色。这里的 Linux 二进制程序是 Canonical 提供的用户模式 Ubuntu 14.04 系统的组成部分,以 Pico 进程的形式启动并在用户模式下运行。此时由 lxss.sys 和 lxcore.sys 这两个驱动负责模拟 Linux 内核并拦截系统调用。大部分情况下,相应的驱动会将 Linux 内核调用映射为对应的 Windows 内核调用,但也有些情况可能缺乏对应的 Windows 内核调用。例如 fork(),Thomas 解释了其中的原理:

根据记录,Linux fork() syscall 没有直接对等的 Windows 调用。当针对 Windows Subsystem for Linux 进行 fork 系统调用时,lxcore.sys 会执行一些前期工作为进程的复制做准备。随后它会调用内部的 Windows NT 内核 API 以使用相应语意创建进程,并为新建的进程完成额外数据的复制。

WSL 提供了两种可被 Linux 访问的文件系统:VolFs 和 DriveFs。前者在各方面都非常类似于常规的 Linux 文件系统,包括权限支持、symbolic 链接、大小写敏感,以及 Windows 文件系统中不允许使用的字符。后者提供了与 Windows 互操作的能力,使得用户能够在 Linux 中看到所有 Windows 卷。

这个功能与虚拟化无关,Linux 二进制程序也没有为了在 WSL 中运行而移植或重编译。这种方式运行的 Linux 命令可以像 Windows 应用程序一样访问本地主机,无需使用虚拟化的网络。

根据 Thomas 的介绍,针对 WSL 进行性能评测后发现,性能表现非常接近用相同硬件直接运行 Linux 的性能,这证明 WSL 在性能方面的表现很出色。

Microsoft 团队曾在 WSL 上运行过 Python 和 Ruby,并像其他 Linux 用户那样使用 gcc 编译过程序,大部分情况下都可以正常工作,但也有一些小问题:sudo 无法完全正常使用,文件系统需要进行一定的调整,运行 MySQL 会遇到一些小问题等。有些用户提到无法运行 Java、Semaphores 或共享内存。目前 UserVoice WSL 频道中最需要的三个特性分别是:在两个环境中使用 slash,通过 Bash 启动 Windows 进程,以及将 WSL 开源。

Microsoft 提供的在 Windows 上运行 Linux 的能力可以帮助运维团队,尤其是负责运维云实例的团队无需更换计算机或使用虚拟化解决方案,便可直接从一台 Windows/Linux 计算机管理自己的所有系统。云中运行的很多计算机都运行了 Linux,这个功能可以让运维人员的工作变得轻松一些。

更多详情推荐阅读 MSDN WSL 概述以及 Channel 9 视频: WSL:架构概述

查看英文原文 Details on How Linux Runs Natively on Windows


感谢夏雪对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-02 19:006058
用户头像

发布了 283 篇内容, 共 99.7 次阅读, 收获喜欢 58 次。

关注

评论

发布
暂无评论
发现更多内容

ThottleStop 软件的应用场景

Jerry Wang

cpu intel 三周年连更

HTAP for MySQL 在腾讯云数据库的演进

NineData

MySQL 腾讯云 NineData HTAP for MySQL 2023云数据库技术沙龙

面对职业焦虑,我们能做些什么?| 社区征文

三掌柜

三周年征文

深入理解 MySQL 索引底层数据结构

Java你猿哥

Java MySQL 算法 ssm sql

LinkFlow发布会实录|食品饮料品牌洞察应用实践分享

游读分享

学习java没规划?2023最新路线图,大堆资源秒变大神

Java你猿哥

Java 数据库 前端 后端 java基础

美团太细了!HashMap可以存null,ConcurrentHashMap不可以为什么

Java你猿哥

Java hashmap ssm

一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器 | 京东云技术团队

京东科技开发者

Spring Boot 处理器 企业号 5 月 PK 榜 Graceful Response web接口开发

mosn基于延迟负载均衡算法 -- 走得更快,期待走得更稳

Java你猿哥

Java 负载均衡 ssm 架构师

代码注释的艺术,优秀代码真的不需要注释吗?

阿里技术

代码注释

项目终于用上了 DDD 领域驱动,太强了!

做梦都在改BUG

Java 架构 DDD

行走的Offer收割机!首次公布Java10W字面经,Github访问量破百万

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

一顿饭的事儿,搞懂了Linux5种IO模型

Java你猿哥

Java Linux 后端 ssm io

精准测试之过程与实践 | 京东云技术团队

京东科技开发者

精准测试 质量保障 企业号 5 月 PK 榜

鬼知道我经历什么,从Java外包到了阿里P7,没想到我也有今天

Java你猿哥

Java Spring Boot JVM java面试 Java八股文

KubeEdge在边缘计算领域的安全防护及洞察

华为云开发者联盟

开源 边缘计算 华为云 华为云开发者联盟 企业号 5 月 PK 榜

精品!阿里P8爆款《SpringBoot+vue全栈开发实战项目》笔记太香了

做梦都在改BUG

Java 架构 Spring Boot Vue 前后端分离

真香! GitHub大牛呕心沥血整理的5000页Java学习手册

Java你猿哥

Java MySQL redis Spring Boot java基础

如何选择合适的共享电动车厂商

共享电单车厂家

共享电动车厂家 共享电单车厂商 景区共享电单车 校园共享电动车 共享电动车生产

最具有中国特色的微服务组件!阿里新一代SpringCloud学习指南

做梦都在改BUG

Java 架构 微服务 Spring Cloud spring cloud alibaba

真香!阿里P8微服务实战心得首次公开,涵盖架构设计所有知识点

Java你猿哥

Java 架构 微服务架构 架构设计 架构师

Istio权威指南,华为云云原生团队倾情巨献!

博文视点Broadview

华为研究院19级研究员几年心得终成趣谈网络协议文档,附大牛讲解

做梦都在改BUG

Java 计算机网络 网络协议

数字人是否能成为企业智能化的门户?

Onegun

人工智能 数字人

被 ChatGPT 点燃的向量数据库们

Bytebase

人工智能 数据库 openai AIGC ChatGPT

技术领先、“忠”于业务,用友走出多维数据库的价值之路

用友BIP

面对本地缓存和分布式缓存,我们该如何选择?

做梦都在改BUG

低代码为什么需要专业代码

牛刀专业低代码

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案

字节跳动数据平台

短视频 DataLeap 电商治理 达人治理 商品安全

主网NFT铸造交易商城dapp系统开发搭建

开发v-hkkf5566

发布会实录|悠易科技CTO李旸:洞察新引擎 品牌新增长

游读分享

  • 扫码添加小助手
    领取最新资料包
Windows原生运行Linux的技术细节_Linux_Abel Avram_InfoQ精选文章