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

为帮助Wine系统在Linux环境中模拟Windows系统调用,Gabriel Krisman Bertazi提出了新版本的补丁集,利用prctl替代seccomp进行系统调用拦截,通过信号处理器实现系统调用模拟,有望提高Wine的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

Emulating Windows system calls, take 2

By Jonathan Corbet
July 17, 2020
https://lwn.net/Articles/826313/

六月份的时候,LWN介绍了一组patch,它新增了一个机制来帮助 Wine 系统来在Linux中模拟Windows的系统调用。这组patch set得到许多关注和评论,导致最终它的实现方式已经变得面目全非了。Gabriel Krisman Bertazi 现在提供了最新版本的实现,使用了一个不同的方式来解决之前的这个问题。

回顾一下,这个工作的主要目标是希望能允许将要运行的windows可执行程序可以直接调用到Windows kernel,而不需要经过Windows API。这些系统调用必须要被trap(截获)下来然后通过emulate(模拟)方式来让此程序能正确运行。实现的时候,不可以修改这个windows程序本身,以免Wine被这些程序中可能具有的作弊检测代码给误判。之前的做法是新增了一个mmap()的flag,可以标记某个程序的地址空间来禁止它直接执行系统调用(make direct system call)。还需要跟一个新增的seccomp() mode配合起来,因为需要依赖它来截获从被标记出来的这块区域所发出的系统调用。这个方案引起了不少担忧,尤其是因为使用了seccomp(),这会让人误以为这个功能是一个安全机制(其实并不是)。

新的patch set就移除了seccomp(),而是转为使用prctl(),这是根据第一版patch时收到的一个反馈信息来实现的。具体来说,如果某个程序希望能使用这个系统调用截获并模拟的功能,就可以先发出下面的调用:

prctl(PR_SET_SYSCALL_USER_DISPATCH, operation, start, end, selector);

这里的 operation 可以是 PR_SYS_DISPATCH_ON 或者 PR_SYS_DISPATCH_OFF 。前者表示打开system-call trapping功能,后者是关闭。 start 和 end 这两个地址指明了memory地址区间,哪怕system-call trapping功能打开了,这个区间内的系统调用也不会被截获,这样这里就可以放置那些真正执行system-call emulation的代码了。这里的 selector 参数是一个指向内存中某个byte的指针,它是另一种开关system-call trapping功能的方式。

如果通过 PR_SYS_DISPATCH_ON 打开了此功能,kernel会在进程的task structure里面设置上 _TIF_SYSCALL_USER_DISPATCH 这个flag。每当进程发起系统调用的时候都会检查这个flag。flag为1的话,就需要额外检查一下 selector 指向的内存区域,这里存放的如果是 PR_SYS_DISPATCH_OFF ,那么系统调用就会得到正常执行。如果这里存放的是 PR_SYS_DISPATCH_ON ,那么kernel就会对此进程发送一个SIGSYS信号。

响应的signal handler在处理信号的时候就可以检查相关的寄存器值了,也就是能看到发起的是哪个系统调用,以及相关的参数是什么。在这个signal handler里就可以完成模拟此系统调用的工作了。等到signal handler返回的时候,进程就可以跟在截获的系统调用之后来继续执行了。这个signal handler必须得放置在前面提到的特别的(允许执行系统调用)那块memory区域,否则就无法正常工作了。哪怕这个signal handler本身不需要调用系统调用也得按此执行。在Linux里面,从一个signal handler返回的时候都会触发一个特别的sigreturn()系统调用,执行的时候绝对不可以再次被截获到这个signal handler里面,否则就嵌套进去死循环了。

这里专门设计的 selector 变量可以快速地打开和关闭这个截获机制,不需要每次都调用到kernel里面绕一圈了。对于Wine这种系统来说,会需要频繁在Windows和Linux-native的代码里面切换,采用这种技巧应该可以引入不少性能提升。

第一版的patch set当时在mailing list上引起了许多讨论。而这次则只有Kees Cook的一个回复,他称这个patch set看起来非常好。所以看起来这个功能应该可以在近期能合入mainline了。

全文完

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值