- 主题:在龙芯3A5000上运行Windows程序
现在二进制翻译来跨平台很火啊
微软用二进制翻译来让arm版的安卓程序跑在x86的windows上
龙芯用二进制翻译让x86版的windows程序跑在loongarch的linux上
“至此,就可以尝试在龙芯3A5000的电脑上用二进制翻译功能运行任何的32位Windows程序了。可能成功,也可能运行出错。反正我已经成功安装、运行了很多小软件和游戏,比如7z、帝国时代2、仙剑奇侠传、愤怒的小鸟、CS……等等。”
guee
昨天 19:33
龙芯3A5000是龙芯最新的桌面CPU,它基于龙芯自主设计的LoongArch架构(指令集),性能接近市场主流CPU水平。因为各种操作系统和应用程序都与指令集相关,所以在x86架构(指令集)的CPU就不能直接运行ARM架构(指令集)的应用程序,反之亦然。因此诞生了各种各样的二进制(指令)翻译技术,用于跨架构模拟运行其它平台的操作系统和应用程序,各种二进制(指令)翻译技术可以分为软件翻译、硬件翻译、软硬结合的翻译这三大类。
二进制翻译技术简述
以软件方式进行二进制(指令)翻译必须存在一个宿主系统,模拟器程序在宿主系统上运行。比如各种游戏模拟器,用来在电脑上玩红白机游戏、街机游戏、PS游戏等,以纯软件的方式构建了一个虚拟的主机环境,让那些游戏程序成为缸中之脑,游戏程序执行的所有指令、请求的所有资源都是由翻译软件模拟出来的,但它以为自己是在真正的主机中运行。
模拟通用计算机的CPU和相关硬件环境要比模拟游戏主机复杂得多。这方面的代表软件,有开源的可虚拟多种架构的qemu、苹果的rosetta 2、以及微软Windows11在arm上模拟x86和在x86上模拟arm的技术等等。其中qemu可以在多种架构(指令集)之间相互转换,但性能最低,平均运行效率仅为原生性能的5%左右。苹果和微软都是一对一的专用翻译,且与操作系统深度结合,效率较高。
硬件翻译以Transmeta CPU为代表,它的CPU本身是一种“超长字指令集”架构,但在指令译码的阶段,接受的是x86指令,然后把x86指令转换为它自己的指令来运行。这种方式使它的CPU看起来就是一块x86架构的CPU,并且不需要对电脑中的其它硬件进行模拟,各种支持x86指令集的操作系统和应用程序都可以在使用Transmeta CPU的电脑上直接安装运行。Intel/AMD现在的CPU其实也是硬件翻译技术的代表,它们内部是执行的“微码(类似于精简指令集)”,而对于的表现则依然是x86架构的处理器。
龙芯的LoongArch架构(指令集)则代表了第三个分类,即软件和硬件结合的二进制翻译方式。这种方式既有软件翻译的灵活性,又能接近或达到硬件翻译的效率,兼具二者的优点。龙芯的二进制翻译本质上也是软件翻译,但是对软件翻译中比较耗时的处理提供了专门的硬件指令来加速翻译过程,因此称它为软硬结合的二进制翻译技术。龙芯之所以不使用纯硬件的翻译方式,是因为我们必须建立自主的软件生态体系。如果像Transmeta那样对外表现为x86的CPU,那么它能直接运行的就只有基于x86的操作系统和应用程序,生存状况高度依赖于Intel和微软的态度,因此它虽然在Intel的诉讼中获胜,但却在Intel对市场的操作下惨然离场。
龙芯的LoongArch架构(指令集)本身是一种独立的,完善的指令系统,可以建立独立于x86/ARM之外的软件生态体系。龙芯的二进制翻译技术主要是在LoongArch原生软件生态建设的初期,用于补充原生软件的不足,LoongArch架构和龙芯CPU的生存不依赖于Intel/ARM/MS/Google等主导的软件生态。二进制翻译技术具有单方面的决定权,任何公司都没有理由阻止任何软件以二进制翻译的方式在某种原生不支持的架构上运行。即使软件开发商以检测CPU型号等技术手段阻止运行,那么以软件为主体的二进制翻译技术也能轻松解决这个问题,而固化在CPU硬件中的各种信息和特征则不可能像软件那样在线升级。以软件翻译为主体的二进制翻译,甚至可以针对特定程序把自己模拟成特定的CPU型号。
即使要翻译的目标架构频繁升级指令集版本,增加新的指令,不断推成出新,对于龙芯来说,要模拟最新的CPU和指令集,也只是更新一下软件的事儿。而那些需要架构授权的CPU产品,如果没有购买到新版本的架构授权,那就无论如何发布多少个新款CPU产品,都不可能兼容新版架构的新指令。
龙芯二进制翻译系统的简单结构说明
龙芯的二进制翻译系统仍在开发当中,尚未公开技术资料,但当前已经有可以使用的测试版本。我仅仅根据对当前状态分析的结果,简单描述一下它的基本结构如下图,可能不太准确,也不够详细,意会就好。
基于龙芯LoongArch架构(指令集)的CPU,在运行原生的LoongArch指令集的程序时,不需要二进制翻译,可以直接运行。
在运行基于其它架构(指令集)的Linux程序时,由龙芯的二进制翻译模块对指令进行转译。程序对Linux的API调用,可以直接由操作系统本身提供支持。
在运行Windows(x86)的程序时,由于Linux系统本身不能提供Windows系统的API,因此需要使用Wine来提供对Windows API的支持。Wine是给Windows(x86)程序提供虚拟的API接口,而不负责对指令的转译。在x86的应用程序中,不但程序自身逻辑以及第三方库的二进制代码都是x86指令,而且用于调用Windows API的二进制代码也是x86指令,如果没有二进制翻译,在LoongArch上是连Window API都无法调用的,更不用说程序自身的代码了。
操作系统API(应用程序编程接口)是由操作系统提供给应用程序的接口,在Linux上运行Windows程序时,假如调用读取文件数据的API,就可以由Wine给应用程序提供这个接口,但接口内部不再是Windows的代码,而是由Wine去调用Linux的相关接口来实现相同的功能,这就是对API的模拟。在应用程序读取到数据之后做的操作,就不在Wine的管辖范围内了。比如程序取得数据后可能加密解密、可能作为图像数据计算对比度、可能作为音频数据计算制作音效……这些操作可能是由程序自身代码来完成,也可能是调用其它的库文件的接口来实现。这些在Wine支持范围之外的代码,在x86架构(指令集)的CPU上是由CPU直接执行,在LoongArch架构(指令集)的CPU上,就只能由二进制翻译模块转译为LoongArch的指令来执行。
操作系统和应用程序对CPU指令的使用,是属于ABI(应用程序二进制接口)的一部分,ABI的层级很低,是二进制代码的规范。在基于LoongArch架构的CPU上运行x86程序时,就是由二进制翻译模块来处理对指令的转译,也就是对x86的ABI规范的模拟。不管是Linux还是Windows的应用程序,只要它不是LoongArch原生指令集的,最终都需要经过二进制翻译才能在龙芯的CPU上运行。
在龙芯3A5000上实战运行Windows程序
最简单的方式,是在使用3A5000的电脑上安装统信的UOS系统,然后等着UOS系统的应用商店中提供了什么Windows软件,就安装什么软件,可以无障碍,无门槛,无后顾之忧……可是Windows的软件千奇百怪,UOS的应用商店不可能提供所有的Windows软件,那么我们就需要动动小手,自己解决自己的需求。
目前只有UOS for 3A5000(测试版)系统中集成了龙芯的二进制翻译模块,而龙芯自己的Loongnix为什么反而还没有提供二进制翻译的支持呢?“测试版”这三个字很重要,是否稳定无关紧要。龙芯的Loongnix却是已经正式发布的产品,对于龙芯的政企用户来说,往系统中更新一个还没有开发完成的、可能不稳定的功能模块,大概不是什么喜闻乐见的事情。因此我下面就以UOS为例说明一下如何在龙芯3A5000上运行“任何”的Windows软件,“任何”是指可以尝试任何软件,但不能保证所有软件都能正常运行。
UOS中已经集成了龙芯二进制翻译模块,但要运行Windows软件仍然需要一个Wine环境。UOS本身有多个版本的Wine,有经过深度/统信改良了效率和兼容性的deepin-wine,也有原生的版本,我们要使用deepin-wine。最简单的方式是从UOS应用商店中安装一个由Wine支持的软件,环境就自动配置好了。如果使用Loongnix或其它的系统,就需要手工完成这个过程,可能还需要从UOS复制一些文件和配置,比较麻烦。建议安装的软件是PhotoShop,因为PhotoShop是一个很大很复杂的软件,能够让PhotoShop正常运行的环境,就能让大多数软件正常运行。
UOS对Wine版软件的组织方式是给每个软件一套单独的Windows环境,也就是说每个软件包中都有配套的Windows、Program Files、ProgramData、User等系统文件夹。这些文件夹和软件本身,都被打包成一个files.7z文件,安装到“/opt/apps”文件夹下以包名命名的子文件夹中。软件首次运行时,files.7z被解压到“/home/用户名/.deepinwine/”文件夹中,并自动配置相关的运行环境。这种方式的好处是每个软件都相对独立,避免因某些共用文件的版本不同导致不能运行,坏处就是会增加许多额外的文件。但实际增加的文件体积并不会很大,因为前面说了Wine只是提供虚拟的API接口,因此包中的操作系统的DLL文件实际都是只有接口没有代码的“代理”版本,每个文件只几KB大小。系统DLL接口的功能是由Wine文件夹中的对应的.so文件来实现的。只有系统DLL之外的,软件自身的以及第三方的DLL文件才是“真实”的DLL文件。
在安装了PhotoShop(Wine)之后,在“
/opt/apps/com.pscs6.deepin/files”文件夹中的files.7z和run.sh是我们需要用到的。
如果你已经运行过刚刚安装的PhotoShop,那么在“/home/用户名/.deepinwine”文件夹中会有“Deepin-CS6”文件夹,“.deepinwine”是隐藏文件夹,在Linux中文件(夹)名字前面加“.”表示隐藏,在文件管理器中看不到,需要手工在地址栏输入才能打开。它里面的内容如下:
dosdevices文件夹中的内容是虚拟硬盘盘符和com接口的链接文件,比如“c:”文件就链接到“drive_c”文件夹。“drive_c”文件夹是虚拟的Windodws系统的C盘,里面的内容一看就眼熟:
如果你要向这个由Wine虚拟的Windows环境中安装软件,或复制绿色软件来运行,就把“drive_c”当成Windows的C盘来用,都往里面复制就行了。其实直接使用PhotoShop的这个Wine环境文件夹也可以,但是为了避免一些麻烦,比如防止意外卸载了PhotoShop之后你放在里面的软件也被一同删除,我们还是最好自己弄个单独的环境。另外说明一下,这是32位的Wine环境,不能运行64位的Windows程序,如果要运行64位的程序,需要手工配置64位的环境,因为UOS还没有提供直接安装的64位Windows程序。
先把前面在“
/opt/apps/com.pscs6.deepin/files”中看到的files.7z复制到“/home/用户名/.deepinwine”文件夹中,然后在files.7z上单击右键,在右键菜单中选择“解压到当前文件夹”。然后“/home/用户名/.deepinwine”下面就会多出一个“files”文件夹,把它改个名字,比如“MyGames”或者像我一样改成“Default”。这个文件夹中的内容和之前“Deepin-CS6”文件夹中的一样,但你不需要在这里运行PhotoShop,因此可以把“/home/guee/.deepinwine/Default/drive_c/Program Files”里面的Adoeb删除掉,节省一些空间。
再然后可以把载到的绿色软件或者安装程序等都复制到“
/home/guee/.deepinwine/Default/drive_c”中你喜欢的位置,最后前面看到的“run.sh”复制出来进行一些修改,就可以运行它们了。当然也可以复制下面的内容,保存为一个扩展名为“.sh”的文件,注意要在文件属性的“权限管理”中设置“允许以程序执行”。
#!/bin/sh
#在/home/guee/.deepinwine/下面你的Windows环境所在的子文件夹名。
BOTTLENAME="Default"
#Wine的版本
APPVER="13.0deepin6-wine5"
#要运行的程序的路径,你的drive_c文件夹就是c:/,后是相对于它的路径。
#注意Linux中的路径分隔符是/,而Windows中是\,这里按照Linux的规则写。
EXEC_PATH="c:/ali213-AngryBirdschs/AngryBirds.exe"
#启动Wine的脚本程序,是Wine自带的。
START_SHELL_PATH="/opt/deepinwine/tools/run_v4.sh"
#大概是这个程序关联的文档类型,这里设置为""。
export MIME_TYPE=""
#Wine的主程序,这是环境变量,在run_v4.sh这个启动脚本中会使用它。
export APPRUN_CMD="deepin-wine5-stable"
#语言环境设置
export PATCH_LOADER_ENV="LC_ALL=zh_CN.UTF-8"
#也是环境变量设置
export SPECIFY_SHELL_DIR=`dirname $START_SHELL_PATH`
DEEPIN_WINE_BIN_DIR=`dirname $APPRUN_CMD`
DEEPIN_WINE_DIR=`dirname $DEEPIN_WINE_BIN_DIR`
#export WINEPREDLL="$ARCHIVE_FILE_DIR/dlls"
#还是环境变量设置
if [ -n "$PATCH_LOADER_ENV" ] && [ -n "$EXEC_PATH" ];then
export $PATCH_LOADER_ENV
fi
if [ -d "$DEEPIN_WINE_BIN_DIR" ] && [ "$DEEPIN_WINE_BIN_DIR" != "." ];then
export DEEPIN_WINE_BIN_DIR
fi
#启动Wine,并指定由Wine启动的应用程序。
$START_SHELL_PATH $BOTTLENAME $APPVER "$EXEC_PATH" "$@"
上面的“EXEC_PATH”后面的字符串就是你要运行的程序路径,我是从“游侠网”下载了一个绿色版本的《愤怒的小鸟》,其实看到文件夹名中的“ali213”应该就猜到了。这是绿色软件,如果要运行的不是绿色软件而是安装程序,过程也一样,只要把安装程序设置为要运行的程序就可以了。安装完成后,可以再修改一下运行脚本,把“EXEC_PATH”后面的字符串改为安装完成的程序路径。
安装程序运行时如果在Windows的桌面或开始菜单创建了快捷方式,一般情况下Wine就会自动帮你在UOS的桌面和开始菜单中创建对应的Linux格式的快捷方式。如果Wine没帮你创建,那么也可以自己创建,也就是编写一个扩展名为“.desktop”的文件放在桌面上,或者“/usr/share/applications”中(开始菜单中的程序快捷方式)。只是向“/usr/share/applications”这个文件夹写文件需要root权限,如果没有打开UOS的开发者模式,那么把“.desktop”文件放在“/home/用户名
/.local/share/applications”中也可以。
“.desktop”文件的格式我就不详细说明了,在网上有很多资料。
至此,就可以尝试在龙芯3A5000的电脑上用二进制翻译功能运行任何的32位Windows程序了。可能成功,也可能运行出错。反正我已经成功安装、运行了很多小软件和游戏,比如7z、帝国时代2、仙剑奇侠传、愤怒的小鸟、CS……等等。
- 来自「最水木 for iPhone14,3」
--
FROM 220.196.194.*
写了满篇,中心思想是?
【 在 Xaoyao 的大作中提到: 】
: 现在二进制翻译来跨平台很火啊
: 微软用二进制翻译来让arm版的安卓程序跑在x86的windows上
: 龙芯用二进制翻译让x86版的windows程序跑在loongarch的linux上
: ...................
--
FROM 223.104.39.*
又是毛德操那帮科学家搞的?
佩服
【 在 Xaoyao (劳动最光荣) 的大作中提到: 】
: 现在二进制翻译来跨平台很火啊
: 微软用二进制翻译来让arm版的安卓程序跑在x86的windows上
: 龙芯用二进制翻译让x86版的windows程序跑在loongarch的linux上
: ...................
--
FROM 124.240.54.*
中心思想不就是标题:
龙芯3A5000上可以运行windows程序
【 在 xiaosihuo 的大作中提到: 】
: 写了满篇,中心思想是?
: 【 在 Xaoyao 的大作中提到: 】
: : 现在二进制翻译来跨平台很火啊
: ....................
- 来自「最水木 for iPhone14,3」
--
FROM 220.196.194.*
现在看来,龙芯比那帮搞AI的良心多了,还是做了实事的
【 在 Xaoyao 的大作中提到: 】
: 中心思想不就是标题:
: 龙芯3A5000上可以运行windows程序
: 【 在 xiaosihuo 的大作中提到: 】
: ...................
--
FROM 112.10.65.*
给个摘要,给点图片和数据。
这样大篇的叙述,没人看。
【 在 Xaoyao 的大作中提到: 】
: 现在二进制翻译来跨平台很火啊
: 微软用二进制翻译来让arm版的安卓程序跑在x86的windows上
: 龙芯用二进制翻译让x86版的windows程序跑在loongarch的linux上
: ...................
--
FROM 111.202.46.*
真是忽悠外行吗?
LINUX的开源项目里面,在LINUX上运行WIN,已经很久很久了
STEAM那个公司,VALVE,马上出的STEAM掌机,STEAM DECK
就是在LINUX上运行WIN的游戏
--
FROM 58.213.108.*
wine 还是跑在 x86 平台上的。Steam 那个跑的是原生的 GNU/Linux 程序,也有部分是 wine,也要跑在 x86 平台上。
其实文章重点应该是跑 x86 程序,而不是跑某操作系统的程序。
【 在 EmperorPiero (皮埃罗球皇) 的大作中提到: 】
: 真是忽悠外行吗?
: LINUX的开源项目里面,在LINUX上运行WIN,已经很久很久了
: STEAM那个公司,VALVE,马上出的STEAM掌机,STEAM DECK
: ...................
--
修改:ArchLinux FROM 103.90.178.*
FROM 103.90.178.*
steam可都是win程序
【 在 ArchLinux 的大作中提到: 】
: wine 还是跑在 x86 平台上的。Steam 那个跑的是原生的 GNU/Linux 程序,也有部分是 wine,也要跑在 x86 平台上。
: 其实文章重点应该是跑 x86 程序,而不是跑某操作系统的程序。
:
--
FROM 221.226.97.*
继续顶
【 在 Xaoyao 的大作中提到: 】
: 现在二进制翻译来跨平台很火啊
: 微软用二进制翻译来让arm版的安卓程序跑在x86的windows上
: 龙芯用二进制翻译让x86版的windows程序跑在loongarch的linux上
: ...................
--
FROM 222.128.106.*