• 发文
  • 评论
  • 微博
  • 空间
  • 微信

中兴新支点Linux桌面操作系统在龙芯CPU上支持QQ

Linux极客 2017-10-18 17:25 发文

是的,你没有看错

中兴新支点桌面操作系统要在龙芯CPU上支持QQ

目前腾讯官方只发布和维护Windows版本的QQ,通过Wine技术则可以实现使Windows版本的QQ运行在Linux系统上,中兴新支点桌面操作系统已发布在Linux x86 CPU上的NewStart QQ

中兴新支点桌面操作系统软件中心

【NewStartQQ下载】

中兴新支点桌面操作系统软件中心

【NewStartQQ】

要在Linux龙芯CPU上支持QQ,这其实在业内算是一件非常,非常非常困难的事情!那么中兴新支点桌面操作系统在龙芯CPU上支持QQ之旅到底有多艰险?

「 背 景 」

在国家信息安全的大背景下,CPU及操作系统的国产化就首当其冲。其中,龙芯无疑是国产化CPU领域的领军者,特别是龙芯3A3000,其在结构和主频上的突破,使其在用户体验上大幅度提升。而操作系统则是清一色Linux操作系统,正如我们的中兴新支点桌面操作系统。在成功适配龙芯3A3000后,我们首先就遇到了在龙芯上支持QQ的需求,经过深入分析这一需求的市场,我们决定啃一啃这块硬骨头。

「 方 案 初 定 」

首先,我们来客观分析下龙芯上支持QQ这件事的实际状况:

问:有Linux版本的QQ吗?

答:QQ早些年以前有Linux版本,但是这个版本已经处于不被维护,存在功能严重缺失等问题。而目前腾讯官方只发布和维护Windows版本的QQ。

问:Windows版本QQ能在Linux上运行么?

答:当然可以,只要通过Wine技术(Wine简单说就是在Unix平台模拟Windows API的一个“模拟器”,从而使Windows上的应用程序(EXE文件)能直接运行在Unix环境中,而且性能损失不大),可以使Windows版本的QQ运行在Linux系统上。例如,我们看到的龙井QQ、深度QQ、NewStart QQ。但是这里需要特别注意,此处所有的Wine解决的将Windows应用程序迁移到Linux平台上运行,它们都是同在x86 CPU上。

问:x86应用程序能运行在龙芯环境中么?

答:当然也可以,有很多种方式,比如各种虚拟机、应用虚拟化,这些(基本)也有一个共同的基础:Qemu 。

问:Qemu是什么?

答:Qemu是一个真正的虚拟机,用于各种硬件架构平台的模拟,其包括system和Linux-user两种模式。Linux-user模式,顾名思义,其完全运行于用户态。其基本原理是将应用程序的指令(x86指令)逐条翻译成与架构无关的中间指令,然后再将中间指令翻译成主机上能运行的目标指令(Mips64指令),翻译后的指令能直接在主机上执行。

所以,要在龙芯上运行QQ需要解决两大技术问题:

1、Windows API到Linux API翻译(转换),这个理论上可以通过Wine解决。

2、x86硬件指令到龙芯(Mips64)硬件指令的翻译,这样理论上可以通过qemu linux-user模式解决。

那么,看似有可能了

Qemu+Wine!应该能解决问题!

哇,理论方案已出,我们撸起袖子开干吧!

「 遇 到 难 题 」

没想到一开始就遇到以下难题:

第一,x86上的应用程序在龙芯环境中使用qemu linux-user模式运行,直接就发生crash,哪怕是最简单的hello world。原因是龙芯是Mips架构,相较x86和ARM,它的社区参与度没有那么高。而无论是Qemu、内核还是Wine,都涉及硬件相关的实现,而这些关键的组件中,对龙芯(Mips)支持都不好,一方面不稳定,另一方面很多功能缺失。所以,想要在龙芯上运行QQ,还要翻越很多座未知高山,想想都是一身冷汗!

第二,性能损失,即使在x86 PC机上使用Qemu以纯软件的方式模拟执行其它架构的应用程序,也会有较明显的性能问题。因为Qemu模拟指令,需要经过两次转换(见Qemu原理介绍),一条guest指令翻译成host指令后,可能是十条,甚至更多。综合来看,纯软件的指令翻译,性能损失基本是一个数量级。x86尚且如此,而龙芯则更甚,结果可能是无法忍受的慢。

第三,龙芯架构自身的特殊架构设计,比如龙芯内核使用默认页面大小为16K。而其它主流架构基本都是用的4K大小的页面,会导致一定的兼容问题。

第四,调试非常非常难!由于需要经过两层翻译,任何问题的分析调试都异常困难。而QQ在成功运行的道路上可能出现的问题不计其数,每个问题的分析调试都是一次考虑和折磨。你可以想想......真的已经不敢想了!

「 我 们 的 进 展 」

就在这样的一座大山接着一座大山,一个大坑挨着一个大坑的艰难摸索中,我们还是取得了以下喜人进展:

第一,我们通过解决Qemu的核心翻译模块tcg中的几个关键bug及龙芯16K特殊页面大小导致Qemu翻译异常的问题,实现了单线程程序可以成功运行在龙芯的Qemu+Wine环境下。目前单线程的x86应用程序(比如SourceInsight3、Notepad++等)已能在中兴新支点桌面操作系统中正常运行。

第二,对于多线程的Wine QQ,我们解决了大量的Wine QQ启动dll加载失败的问题。

「 后 续 我 们 将 集 中 攻 克 」


第一,Qemu用户模式的多线程支持。

据分析,目前多线程程序无法运行最主要的原因是,Qemu用户模式不支持多线程应用程序。或者不能说不支持,应该说支持得不好,至少对Mips来说是这样的。所以,需要在Qemu用户模式中的增加(或加固)multithread支持,需要实现两个关键点:原子操作和内存屏障。涉及底层硬件,问题复杂度和难度很大,需要细心专研。

第二,Wine本地化及性能问题。

目前的方案为Qemu+Wine,即将Wine运行于Qemu中,这里将Qemu理解为一个虚拟机的话,即将整个Wine+QQ都运行与虚拟机中。而这其中,Wine属于相当重量级,对Wine的翻译会消耗CPU可能会超过QQ本身,会成为严重的性能瓶颈。所以,该方案只能作为预研和研究使用,基本不太可能使其达到可用状态。所以,基于性能考虑,还需要更轻量级的方案,换个位置:Wine+Qemu或许能行。将Wine本地化,即将Wine直接在龙芯环境中编译和运行,使其运行于虚拟机外。

如此,可以省下大部分的指令翻译时间,大大提升性能。说起容易,做起来就难了(应该说很难),难点在于:

(1)Wine自身对Mips的支持完全没有(x86和Arm架构支持不错),这部分工作需要自己做,社区不可能帮你做,这部分工作的难度和工作量都不小。

(2)Wine和Qemu和应用程序的接口问题。Wine本地化后,如何才能正确的与应用程序和Qemu接口,比如,如何才能让运行于Qemu(虚拟机)中的应用程序调用Qemu外的Wine提供的API,他们之间如何通信。这将是一项难度极大的任务,很有挑战性。

由于Windows没有Mips版本,Wine支持Mips的开发将很难进行,包括调试。

前期的经验告诉我们,前面肯定还会有很高很险的山峰,很多很深的大坑。但是基于我们中兴操作系统研发部门在操作系统领域深耕十余载,在涉及的内核、虚拟化、wine方面丰富的积累和自信.我们相信这趟艰险的航行一定会带来丰盛的成果!我们一起拭目以待吧!

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    Linux极客

    **科技前沿,专注国产操作系统,...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码