Windows原生运行Linux的技术细节

2023-11-06 20:48

本文主要是介绍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),这个子系统的整体架构如下图所示:

当用户以用户模式启动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:架构概述。

原文地址:http://www.infoq.com/cn/news/2016/05/linux-windows


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

这篇关于Windows原生运行Linux的技术细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/358969

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用