Windows 原生运行 Linux 的技术细节

简介:

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),这个子系统的整体架构如下图所示:

screenshot

当用户以用户模式启动 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,这个功能可以让运维人员的工作变得轻松一些。

====================================分割线================================
文章转载自 开源中国社区[http://www.oschina.net]

目录
相关文章
|
8天前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
8天前
|
小程序 Windows
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
MASM32编写的程序在Windows 7,10下运行正常,但在Win XP下运行时只闻其声不见其形的故障
|
1月前
|
安全 Linux Android开发
Linux CFI (Control-flow integrity)技术相关资料汇总
Linux CFI (Control-flow integrity)技术相关资料汇总
|
2月前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
2月前
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
130 2
|
25天前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
18 0
|
1月前
|
Linux 网络虚拟化 Windows
ccproxy windows上用的代理软件(类似linux系统上的squid)
ccproxy windows上用的代理软件(类似linux系统上的squid)
|
2月前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
|
1天前
|
Linux
Linux常用命令包括
Linux常用命令包括
10 5
下一篇
无影云桌面