“国产操作系统为什么没人用?”
“因为上面没有软件。”
“那么多软件,下载下来安装不就行了?”
“不行,现在的软件大多是为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这类开源成果,逐步丰富自身生态,让“没人用”的困局,真正成为过去式。
热门跟贴