UEFI开发探索44 – 龙芯下的UEFI App和Option ROM

(请保留-> 作者: 罗冰)

年初的时候,不少客户都在问,国产的电脑上是不是能用隔离方案?

工程师做了一番调查,大部分客户用的都是龙芯的电脑(3A3000)。硬件上来说,主要是看PCI/PCIE的支持情况;软件上,BIOS需要支持我们的Option ROM,操作系统上的应用程序也得重写。

总的来说,工作量不算大,也不算小,由此开始了我们几个月的产品适配过程。

图1 调试用的机器

图1为目前调试用的机器,CPU为龙芯3A3000,桥片是7A1000,AMD的独立显卡。搭载的操作系统为中标麒麟,界面和windows很像。

本想利用这次研究的机会,把龙芯上的UEFI各方面试一下(是的,龙芯有了UEFI的BIOS),发现不完善的地方太多,无法形成体系。因此,就当做记录这段时间的工作日志吧,方便未来的自己查询。

背景

我在刚接触UEFI的时候,大概2011年,就找到一份文档。是百敖和龙芯梦兰的工程师写的,讲述如何使得UEFI框架运行于龙芯上,当时针对的框架是2F。文档的名字是《龙芯UEFI项目技术文档》,其中的几位工程师其百敖拜访的时候我可能都见过,不过不熟悉。

那个时候我对这块不大熟悉,虽然有朋友在做龙芯的笔记本,也没把这个当回事,略微浏览下,就没去研究了。作者说这篇文档的目标读者,全世界范围内不会超过10个人,知音难觅啊。

扯远了。总之,龙芯支持UEFI的工作很久前就开始了。

我在国庆前又去了一次龙芯研究院,为了隔离卡的Option ROM适配问题。

图2 龙芯中科

内部不准拍照,只能Show一下外面的环境了。这里还是挺远的,最近的地铁有两公里多。我特别讨厌坐车,每次都是从地铁下来后走过了的。北京的空气很不好,很干,让呆惯了南方的我很不习惯。

据和我一起调试的工程师说,龙芯对UEFI的支持做了很多的工作了,不过因为人员等方面的原因,很多工作都还没做完。

确实,以我的感受来说,很多部分都不完善:

1) 调试机制不完善,只能使用龙芯自己做的类JTAG工具调试代码,这对不是开发BIOS的人来说,很不现实;

2) 模拟环境没有移植完,无法编译,日常开发时很不方便实验,只能在实际硬件环境中运行了;

3) 只支持UefiMain()为入口的编译,也就是说StdLib没有支持起来;

4) 龙芯的编译器,源代码是不开放的。(BaseTool目录下的各种编译和链接器)

其他在开发中,也遇到不少问题,就不一一列举了。

总觉得,如果推广龙芯的话,应该降低BIOS以及配套软件的开发难度,减少程序员的准入难度。后面还是有很长的道路要走。

编译环境搭建

实际上,能说的地方不多。龙芯的相关编译器不开放,很多的库也是直接替换的(Intel EDK针对X86和ARM适配过,龙芯是MIPS体系)。

我开发所使用的操作系统是CentOS 7。使用厂商提供的UDK2018-longson的压缩包,并替换BaseTool下的工具。所使用的编译器是gcc-4.4.0,遇到若干缺少库的情况,一个个解决了。

图3 搭建好的编译目录

Linux下的模拟环境使用的是EmulatorPkg,尝试了一下,无法编译。龙芯的工程师告诉我,这块一直没有去做,只得作罢。

我自己写了一个Package,把需要的程序在这个package下编译。编译情况如下:

图4 编译过程

其实与之前在Ubuntu下的编译过程差不多,程序中所遇到的问题其实也差不多。比如gcc对未使用的变量,比微软的编译要严格。修改后都能编译通过。

程序运行效果

我尝试着将第41篇博客的代码移植到了这个平台,它能随机生成颜色块,稍微调整了下代码,就编译通过了。

当然,因为没有EDK的模拟运行环境,只能编译为64位的app,在实际机器上运行。效果与之前是一样的,我就不贴出图了。

至此,所有开发所需要的东西都搭建好了。

我在龙芯研究院呆了一天,一直与工程师调试我们隔离卡的Option ROM问题。问题的原因当然是找到了,后续的工作可以继续开展。至于是什么问题,怎么解决的,那就是另外一个故事了。

后记:处于商业方面的原因,没有获得龙芯公司的授权,我不好将编译环境共享。下次有机会再去,看对方是否愿意推广,到时我再共享。从技术的角度来看,我觉得那些工具没有必要设定使用限制,毕竟intel的这些相应的工具都开源了。

期望在国家越来越重视自主可控的形式下,能够有更多的工程师参与进来,也期望龙芯的生态链越来越好。