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

相关文章

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断