“国产操作系统为什么没人用?”

“因为上面没有软件。”

“那么多软件,下载下来安装不就行了?”

“不行,现在的软件大多是为Windows开发的,国产系统基于Linux改造,没法直接跑。”

“那就专门为国产Linux开发软件啊?!”

“没人开发,因为国产系统没人用。”

“这不就成了鸡生蛋、蛋生鸡的死循环吗……”

这是我和一位朋友关于国产桌面操作系统的真实对话。

其实,近年来国产桌面系统进步显著,像Deepin、统信等,不仅界面贴合国人习惯,还预装了WPS Office、搜狗输入法、有道词典、网易云音乐等常用工具,日常办公已绰绰有余。

打开网易新闻 查看精彩图片

但即便如此,国产系统覆盖的软件仍然有限。面对Windows生态中数以百万计的应用程序,它们只能望洋兴叹。

如果你偏偏需要一个只有 Windows 版本的软件呢?

最简单的做法是用 虚拟机 ,比如VirtualBox,在虚拟机里装一个Windows,再运行所需软件。

打开网易新闻 查看精彩图片

这种方法虽然管用,但效率低、速度慢,体验大打折扣。

打开网易新闻 查看精彩图片

(写到这里我想起来一个做安全的朋友,他极为谨慎,每次需要使用金融类软件,都搞一个Windows虚拟机,用完就删。)

那有没有办法在Linux上直接跑Windows软件,同时还不损失性能呢?

有,答案就是 Wine 。

Wine并非虚拟机,而是一个软件兼容层。它通过“转发”方式,让Windows程序能在Linux上运行。

打开网易新闻 查看精彩图片

要理解Wine的原理,得从底层说起。

0 1

可移植的CPU指令

看这段代码:

intfoo(int x) {return x * x;}

如果都在x86 CPU下编译,Windows上是这样的:

打开网易新闻 查看精彩图片

Linux 上是这样的:

打开网易新闻 查看精彩图片

看起来完全不一样,但是它们使用的x86指令集是一样的,都是mov、 imul 、 ret.....

打开网易新闻 查看精彩图片

只不过,在Windows上,可执行文件的格式是 PE :

打开网易新闻 查看精彩图片

在Linux上是 ELF :

打开网易新闻 查看精彩图片

我把 .text 段(存放CPU指令)都标记了红框,因为其中存放的指令比如 mov 、 imul 、 ret 是相同的。

换句话说, CPU指令本身是“可移植”的 。

于是,Wine的做法很直接: 把Windows可执行文件加载进内存,找到代码段,然后跳转过去执行即可。

如果事情真这么简单,那Windows的生态壁垒早就被打破了。

0 2

真正的壁垒:系统调用

操作系统是个硬件抽象层,提供各种各样的服务:读写硬盘、网络通信、进程管理等等。应用程序要使用这些服务,必须通过 系统调用

而Windows和Linux的系统调用,从名字到参数到语义,全都不一样。

打开网易新闻 查看精彩图片

一个稍微实用的程序,几乎肯定会用到系统调用,那立刻就被这个操作系统给“绑架”了。

比如这个最简单的“Hello World”:

#includeintmain{printf("Hello!\n");return0;}

在Linux上,它调用的是 puts :

打开网易新闻 查看精彩图片

在Windows上,它调用的是 printf :

打开网易新闻 查看精彩图片

puts和printf都C标准库的函数, C标准库最终还是走到系统调用那里,根本跑不掉。

想在Linux上跑Windows程序,有两个思路:

(1)把Windows的系统调用在Linux上重新实现一遍,这和重写一个操作系统差不多了

(2)拦截Windows的系统调用,转成Linux的系统调用。

Wine选择了第二条路。

当Windows程序发起系统调用时,Wine截获它,然后翻译成Linux能理解的调用,再交给内核执行。

打开网易新闻 查看精彩图片

Windows系统调用数量庞大,官方文档语焉不详,源码更是不开放;

很多调用存在奇怪的副作用或历史遗留问题, Wine不但不能“修正”,还得原样模仿,否则程序行为就会异常 ;

更别提游戏了,它们大量使用微软的 DirectX API,而Linux上是 Vulkan 。

打开网易新闻 查看精彩图片

为此,Valve(Steam的母公司)和CodeWeavers(Wine的主要赞助商)合作开发了 Proton 。

打开网易新闻 查看精彩图片

Proton 是 Wine 的增强版,专门把 DirectX 调用转换成 Linux 下对应的图形API(如Vulkan),从而让大量Windows游戏在Linux上流畅运行。

2018年8月,Proton首次发布时,Valve就公布了27款经过认证的游戏,它们在Linux上的表现与Windows原生无异,其中包括《毁灭战士2016》《雷神之锤》《最终幻想VI》等知名作品。

0 3

总 结

看完Wine和Proton的底层工作,你就能理解:让Windows应用在Linux上跑起来,绝不是一件轻松的活儿。

但这也是无奈之举,毕竟Windows称霸桌面几十年,微软通过系统调用、DirectX等API,筑起了一条极宽的护城河。

而Wine,就像在这条河上架起的一座桥,它虽不完美,但已足够让大量Windows程序跨过鸿沟,在Linux世界里畅行无阻。

相信国产操作系统也会充分利用Wine这类开源成果,逐步丰富自身生态,让“没人用”的困局,真正成为过去式。