LWN:在Linux中模拟Windows系统调用!

Windows内核--裸调系统调用(4.1) ntdll.dll NtCreateProcess将服务号0x82传入,通过syscall调入内核系统调用例程。syscall在做什么?在64位系统上,Windows使用syscall指令实现系统服务分发。syscall实现和int 2E类似的作用,只不过它更快速,看它名字"快速调用"。 本文将新增一个系统调用来加深对syscal的理解。 阅读详情

关注了就能看到更多这么棒的文章哦~

Emulating Windows system calls in Linux

By Jonathan Corbet
June 25, 2020
原文来自:https://lwn.net/Articles/824380/
主译:deepL

一直以来,人们有一个想法,希望根据进程地址空间中每次调用的来源不同而对系统调用进行不同处理。例如,OpenBSD里有一种安全增强机制,如果系统调用不是经过C库API来发出的话则会拒绝服务这次系统调用。5月底,Gabriel Krisman Bertazi为Linux提出了类似的机制,但完全不是出于安全性考虑,而是致力于让Windows游戏在Wine下更好地运行。计划能检测和模拟Windows系统调用。这个需求可以通过审查系统调用来源而实现,但这可能不是最终能够合入mainline的解决方案。

为了以最快速度运行,Wine必须尽可能直接在CPU上运行Windows代码。不过,一旦Windows程序进行系统调用,就无法直接执行了,为了Windows系统调用而进入Linux内核态,很可能会出问题。因此过去Wine一直提供自己特制的用户空间Windows API来处理这个问题,该API底层会调用Linux系统调用,来实现所需功能。不过正如patch中所解释的,Windows应用程序越来越多地直接执行系统调用,而不是通过其Windows API,导致Wine无法拦截到这些调用了。

幸好,Linux通过seccomp()的形式提供了拦截系统调用的能力。可惜的是,当前内核中的这种机制,无法做到在这个大进程中只拦截Windows代码这部分的系统调用。如果拦截所有系统调用的话,会大大降低速度,肯定会让游戏玩家不满意的。在seccomp()使用的classic BPF program中,跟踪一个进程的地址空间中哪些部分进行了Linux系统调用,哪些进行了Windows调用,这样实现还是很麻烦的,同样也会影响系统执行效率。所以,这里需要一种新的机制。

这组patch为mmap()增加了一个新的内存保护位,叫做PROTNOSYSCALL,默认情况下,它不会改变内核的行为。然而,如果某个进程在seccomp()中开启了新的SECCOMPMODEMMAP模式,那么任何从标有PROTNOSYSCALL的内存区域进行的系统调用都会被捕获,这样相应的handler代码就可以模拟(emulate)完成这次的系统调用。

Patch的说明里面指出,人们不应该像OpenBSD那样,用syscall来源检查这种方式来解决这个问题:

不言而喻,尽管这个机制是建立在seccomp之上的,但它绝不是一个安全机制,因为恶意的应用程序总是有办法跳转到位于白名单内的内存区域并发起syscall调用。对于Wine游戏这种场景来说,并不需要担心这一点。

说明文档里面指出,之所以使用seccomp()来实现这个跟安全无关的功能,是因为如果不这样做的话,就需要复制大量seccomp()代码来实现这个功能,完全是重复代码。

这一系列的patch引起了不少开发者的讨论,他们对这种机制并不完全适应。例如,Kees Cook问道,是否可以改为在加载时重写Windows二进制代码,把调用syscall的代码换成调用emulate仿真函数的代码。答案似乎是 "不行"。修改游戏代码很可能会触发那些防止作弊的机制,因为作弊者可能就是通过修改代码来达到目的的。Wine开发者Paul Gofman补充说,要进行这样的修改,Wine "需要一些方法来找到那些高度混淆过的、动态生成的代码中的syscall,这些代码防护混淆主要就是为了防止拆解、调试等等恶意操作"。

Matthew Wilcox则建议可以扩展personality()机制来支持一个新的Windows personality。从本质上讲,这就是创建一个新的系统调用entry,专门模拟Windows调用。Gofman回答说,这种方法之前已经考虑过了,但在Linux和Windows代码之间的每次切换时执行personality()调用的成本也太高。这里一个可能的解决方案是实现一个特殊的personality,会查看存储在用户空间内存中的flag来决定如何处理系统调用。Gofman说如果有这样的机制,他可以基于此来开发相关的Wine patch。Krisman打算先试一试。

Andy Lutomirski 还有一些其他建议,首先是 prctl()操作,它可以将所有系统调用通过user-space trampoline来重定向。来自trampoline本身的系统调用将被正常执行。在Wine的例子中,这个trampoline可以模拟来自Windows代码的系统调用,同时将Linux系统调用传递给内核。Krisman表示对这种方法很感兴趣,可能也会开发出来试一下。

Lutomirski的另一个主意是允许一个进程为所有的系统调用建立一个(extended)BPF filter program;他后来将这个想法扩展为让它处理进程的所有 "architectural priviledge transitions(架构特权转换)"。这种方法提供了很大的灵活性,可能在Wine以外的地方也很有用,但它存在一个重大的缺陷:在unprivileged BPF能实现之前,它只能供特权进程调用,这对Wine来说无法接受这个限制。除非有什么新的动向,否则Linux里面目前的观点是无法接受unprivileged BPF,所以BPF filter program看起来并不是一个Wine可以接受的解决方案。

经过这次讨论,这个问题本身大家都已经理解了,并且大家都赞同要解决这个问题。不过这个解决方案将采取什么形式还远未明确,有多种方法需要试验。随着开发者们正在努力寻找哪种想法最合适,未来应该可以看到更多的patch。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

Linux系统上安装Windows虚拟机(VMware、VirtualBox) 世人都在思索如何在Windows系统上安装Linux的虚拟机,今天,逆天而行了家人们。在Linux上安一手Windows。 阅读详情

相关推荐

Linux用的windows模拟器

Linux用的windows模拟器,在Ubuntu、Ubuntu kylin可用

vm虚拟机操作

vm虚拟机操作

qwertf123的博客 1701

NVIDIA Orin AGX开发环境搭建避坑指南:从Ubuntu 22.04到ROS2完整配置流程

本文详细介绍了NVIDIA Orin AGX开发环境搭建的全流程,从Ubuntu 22.04系统安装到ROS2深度优化,涵盖驱动部署、CUDA环境配置、散热与功耗管理等关键步骤。特别针对Orin AGX的特性提供了实用避坑指南和性能优化技巧,帮助开发者高效完成开发环境配置。

weixin_28340315的博客 451

【Linux】【操作】Linux环境运行Windows程序方式一览(全网最全)

Windows上有些软件在 GNU/Linux 中有替代方案 ,但还是有许多无法取代的软件 (例如Adobe Photoshop,大型PC游戏 等),本文将常用的在Linux主机环境运行Windows程序的方式做一归纳总结,供各位参考。

一介草民,只为生活。 5743

Tauri开发环境配置避坑指南:从Rust到Node.js的全流程实战

本文是一份详尽的Tauri开发环境配置实战指南,重点解析了从Rust工具链安装、Node.js版本管理到IDE配置的全流程。文章深入探讨了包管理器选择、依赖锁定、网络镜像加速等关键环节,并提供了开发与构建过程中典型问题的排查思路与解决方案,旨在帮助开发者高效避坑,顺利搭建跨平台桌面应用开发环境。

w3x4y的博客 292

永久关闭Windows更新的5种方法

很多家用电脑,如果系统自动更新的话,会变得越来越卡顿,且硬件型号兼容也并不完美。那么我们该如何彻底关闭Win11的自动更新呢?以下准备了5种方法,您可以根据自身实际情况选择合适的方法!

qq_43652793的博客 1万+

linux下调试windows内核,在windows下调试linux内核

下载part1part2编译过程:1). 解压后默认的文件夹位置是在D:/Linux-0.11,如果你不是将文件解压到该目录下,你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录.2). 打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台.3). make 一下,生成1.44M的Boot.img软盘镜像,要清除编...

weixin_29613721的博客 291

重带电粒子的能量歧离(energy straggling)

能量歧离,Bethe-Bloch

G751888629的博客 2298

linux可以运行Windows程序吗,如何Linux系统上运行Windows应用程序(7)

比较下面是对运行于 Windows XP 上的和运行于 Red Hat 的 GNOME 中的消息框(Message Box)视觉上的对比:对应于此的 C 代码(callDll.cpp 中第 60 行):MessageBox(NULL, "Wine test ending...", "", MB_OK);这提出了一些有趣的观察:最明显的观察之一是,双方都支持消息框的使用;这是将 Windows 调用...

weixin_29138345的博客 1020

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2434

HybridCLR热更新全流程实操:用Addressables实现资源+代码双热更(Unity 2021版)

本文详细介绍了在Unity 2021 LTS版本中,如何结合HybridCLR代码热更新与Addressables资源管理系统,实现资源与代码的双热更解决方案。通过环境配置、技术架构设计、实战案例和性能优化,帮助开发者解决中大型项目中的依赖管理和版本协同问题,提升游戏迭代效率。

cc789的博客 845

LWN: 模拟Windows的系统调用,第二版!

关注了就能看到更多这么棒的文章哦~Emulating Windows system calls, take 2ByJonathan CorbetJuly 17, 2020https:/...

Linux News搬运工 450

地理空间智能体(GI Agent)

地理空间智能体(Geospatial Intelligence Agent, GI Agent)是AI Agent技术与地理信息系统(GIS)深度融合的产物。其核心是以大型语言模型(LLM)为驱动,通过自然语言理解、任务分解和工具调用能力,实现地理空间任务的自动化执行。​关键特性​自主性​:独立规划任务流程(如空间数据检索、分析、可视化);​交互性​:支持自然语言对话交互,替代传统图形界面操作;​扩展性​:灵活集成第三方工具和API,支持跨平台协作。

百态·数智思维 | 聚焦大数据、量化与未来AI 2032

LWN:新增ioctl来检测内存被写入过!

关注了就能看到更多这么棒的文章哦~An ioctl() call to detect memory writesBy Jonathan CorbetAugust 10, 2023ChatGPT assisted translationhttps://lwn.net/Articles/940704/kernel 需要知道一个进程的内存是何时被写入的,这个用处很多,其中之一就是可以用来确定哪些页面(p...

Linux News搬运工 1213

uniapp:解决微信小程序包体积超过2M的优化方案+详解分包问题,编译小程序体积大于2M不能上传和预览提示体积太大的处理教程,uniApp微信小程序主包过大问题如何解决(排查可疑点+分包+最小改动)

uniapp微信小程序开发,如何解决打包太大无法预览发布的问题,uniApp微信小程序包体积超过2M的优化方法,uni-app打包微信小程序主包超2M终极解决方案,使用uniapp开发微信小程序使用uni_modules导致主包文件过大,无法发布的解决方法,UniApp开发的微信小程序主包过大问题及解决方案 编译小程序时Node-modules被打入主包,小程序体积大于2M不能上传和预览,怎么处理,解决微信小程序主包太大问题,微信小程序中主包和分包过大,详解分包问题,uni-app 微信小程序发布时,主包超

✅ 精选推荐文章 5066

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux操作系统发展历程与核心技术解析

Linux作为开源操作系统的代表,采用模块化内核设计,支持多任务处理和虚拟内存管理等核心功能。其技术架构包含进程管理、内存管理和文件系统等关键子系统,通过GPL许可证保障了开源自由。Linux在服务器、嵌入式系统和云计算领域广泛应用,特别是在容器化和云原生技术中发挥重要作用。随着物联网和人工智能的发展,Linux持续优化实时性和资源管理能力,成为现代IT基础设施的基石。

dianzongfan5428的博客 339

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C语言为何仍是操作系统内核开发的首选?内存管理与硬件交互的绝对优势

在计算机系统编程领域,内存管理和硬件交互是两大核心基础概念。内存管理涉及程序如何分配、使用和释放内存资源,直接关系到程序的性能和稳定性;硬件交互则决定了软件能否直接、高效地控制底层硬件设备。这些底层技术原理构成了操作系统、驱动程序和嵌入式系统等关键基础设施的基石,其技术价值在于实现对计算资源的极致控制和高效利用。在操作系统内核、嵌入式固件、高性能中间件等对性能、资源消耗和确定性要求极高的应用场景中,开发者需要一种能够提供直接内存访问、最小运行时开销和高效硬件抽象的语言。C语言凭借其指针操作、内存布局控制和贴

android_mylove的专栏 442

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

kernel cleanup

前言“goto error”模式因引入不易察觉的资源泄漏而臭名昭著。在已经存在多个展开条件的代码路径中添加新的资源获取约束既繁琐又容易出错。“cleanup”辅助函数可以帮助编译器减轻这种繁琐的工作,并有助于维护后进先出(LIFO)的展开顺序,从而避免意外的资源泄漏。

qq_41720266的博客 58

window应用在linux运行,如何在Linux上运行Windows应用程序?

原标题:如何在Linux上运行Windows应用程序?一些人可能避免在Linux上运行Windows应用程序,但事实上有时候这么做大有帮助。一些人无法摆脱Windows的最主要原因之一是可用的应用程序。有时候,这些应用程序是老式应用程序,没有开源替代版本。有时候,完全是有人就想玩青睐的视频游戏。虽然这些年来面向Linux的可用应用程序和视频游戏大幅增加,但是总是有“那些特定的软件”似乎是缺失的。如...

weixin_35251837的博客 4014

Linux环境运行Windows程序方式,在 Linux 环境中运行 Windows 程序可以通过模拟、虚拟化、容器化或其他跨平台工具来实现,10 种方式及其具体实现方法

Linux环境运行Windows程序方式,在 Linux 环境中运行 Windows 程序可以通过模拟、虚拟化、容器化或其他跨平台工具来实现,10 种方式及其具体实现方法。

代码讲故事 5844

Linux:如何在Linux中运行Windows程序

本文以实例说明如何在Linux中运行Windows程序。

Linuxest 1万+

在Linux环境中用模拟Windows中的线程消息队列

      本文对于内核中加入了System V 进程通信机制的系统来说是多余的,因为System V 进程通信机制中已经实现了消息队列。对于那些未将System V 进程通信选入内核编译的系统(本文中将要描述的就是这类情况,下面所提到的都是这种Linux系统,不再特别说明),要如何实现类似Windows的线程消息队列操作(PostThreadMessage / GetMessage)呢?  

ppiy3670的专栏 1784

linux内核消息机制,Linux下模拟一个简易的消息机制

消息机制是WIN32的核心,本质就是一个消息结构的链表。声明#define MSG_ERROR -1#define MSG_SUCCEED 0 #define MSG_TRUE 1#define MSG_FALSE 0 #define PM_NOREMOVE 0x00#define PM_REMOVE 0x01 typedef unsigned longWPARAM; typedef unsign...

weixin_39689506的博客 305

[Wine]以及[中文显示补丁]的安装-1.1.3

中文显示补丁是根据本论坛ct兄的中文按钮补丁做的修改,不是汉化补丁,也不是必须的,并且本补丁可能与某些软件有冲突。 安装打好本补丁的Wine可以解决某些在设置中文字体后(比如http://forum.ubuntu.org.cn/viewtopic.php?t=72933)依然出

wince--linux的专栏 1378

Linux服务器安装Windows虚拟机

在 Linux 系统中安装 Windows 虚拟机,使用 VirtualBox 虚拟机软件,类似 Windows 下面的 VMware 软件。 下载地址:Linux_Downloads – Oracle VM VirtualBox 一、Linux系统安装VirtualBox 1. 根据Linux的系统版本选择下载对应的VirtualBox版本 2. 创建repo配置文件 当前页面下滑至最后,点击查看repo文件 登录服务器后台,在 /etc/yum.repos.d/目录下...

qq_38118903的博客 2万+
上一篇: LWN:使用ESPHome的简单IoT设备
下一篇: LWN:打算在Fedora 33中做哪些改动?
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值