玩客云Amlogic S805 适配Win10 arm32记录 – 1

事情起因是这样的,某天正在闲逛it之家,发现这样一篇帖子,刷了Windows 10 ARM32的Lumia 1520使用体验及教程 – Lumia 1520,Windows 10 ARM – IT之家,Arm32也能成功运行windows了?这顿时激发了我的兴趣,想到手头正好有个玩客云,刚好由于众所周知的原因,闲着也是闲着,正好可以折腾折腾,万万让我没想到这一脚竟然踏进了一个无底洞,以为很简单,结果被现实狠狠地打了脸,在没有任何人的帮助下(就算是想找人也找不到,会的人本身就少,大佬也不愿意解答你最基本的问题),自己瞎折腾了三个多月,竟然也小有所成。想着这方面(EDK2/UEFI开发)本身的资料也非常的少,在开发中还是有深深的无力感,遇到问题了不说能不能查到解决方案了,就是要查什么关键字都不是很清楚,互联网上能找到的关于EDK2开发的资料本来就少,ARM下的EDK2开发更是绝迹了,于是专门开了一个博客,记录分享下我踩坑的历程,希望给后人留下一点经验。

这个系列应该会很长,其中涉及到了非常多的计算机底层的内容,目前还是处于草稿阶段,很多东西可能说得不详细,我想的是先把这个架构打好了再来充实内容。创作过程中也会一直有新的灵感和发现,后续会一直补充,以下均为个人开发摸索出来的经验,不保证完全正确,如有错误麻烦指正。

1.无知入坑

刚开始进行这个项目的时候,有点无从入手的感觉,由于本人之前主要做的是软件开发,并不是专业的硬件工程师,只对开发板这些有些大概的了解,并不深入,并且没有实际操作过,对我的切入造成了很大的影响。最开始当然是收集资料了,让人很操蛋的是,网上能找到的资料非常少,大部分都是玩Linux,或者单片机的,好在我不是第一个吃螃蟹的,之前就有开发者@imbushuo 成功在手机上运行了Win10 arm64,并且已经开源,我大概看了下,主要就是做一个UEFI BIOS,然后刷进去,再解包泄露的win10arm镜像,用UEFI引导。我最初的想法:走一遍别人走过的老路,先摸一下流程,虽然我没有对应的硬件,我先把他编译出来了,弄到我机器上运行一下,看看有没有反应,能跑到那一步。接着把整个架构弄清楚,把别人的代码拷chao贝xi过来,然后改改就OK了。事实证明我还是太天真了,复制过来的代码连编译都是个问题,妥妥的一堆报错,我凭借我多年的开zuo发si经验,得出了一个结论,一般应该都不是代码本身的问题,因为作者发布这些源码肯定是经过编译测试的,应该从编译环境的配置找原因。

首先就是解决交叉编译器的问题,仔细一看,编译器都有一大把,还有各种类型的编译器,这里我只选了gcc,不过就光gcc的选择就够喝一壶了,gcc有各种厂商出的,大版本号主要有gcc4-gcc8,小版本号更是数不胜数,差一点都会导致一些编译问题,还有带硬浮点和不带硬浮点的,还有各种平台的,文件名前缀后缀的含义,说实话到现在我都没搞明白这些编译器的区别在哪里,依照前人的足迹我找到了:http://releases.linaro.org/components/toolchain/binaries/

这里我们是arm32的平台,肯定不能跟他选一样的,最开始想能在windows下操作就最好在windows下操作,能省点事,于是选择了用mingw版本的,具体遇到的编译问题太多了,多到我都记不清了,我记得最搞笑的是,由于Windows下echo命令和Linux有区别,而makefile里面又用到了这个命令,要改先得找所有用到了这个命令的文件,再一个个改,于是为了省事,直接用c写了个echo.exe 扔到System32目录下了。

aarch64架构和arm-eabi的配置还是有很大区别的,很多报错都与它有关,还有很多问题,后面想起来再补充吧。

接着就是Python的问题,我的电脑上本身安装了python3,但是udk2018使用的还是python2的环境,写法不一样,想着改改写法算了,没想到越改越多,一气之下,卸载了Python3,然后又重新安装了Python2,重新配置了环境变量,想着还好没用Linux,如果是Linux环境下需要改Python环境,麻烦程度简直不是一个等级的,记得上次折腾pip,用pip安装库,结果发现pip版本过低,过低那就升级呗,一行apt install 过去,升级是成功升级了,又提示setuptools版本过低,又一条命令过去,setuptools是更新成功了,又提示Python版本过低了(***),没事,再一行apt install python3 过去,安装是安装成功了,结果版本还是过低,需要3.5以上的。。。好了,apt算是搞不定了,也没有发现有编译好的包,只能去官网下载源码编译安装了,下载,解压,configure,一顿操作过去,又是一堆报错,上网查了下,又是缺少这个库,又是缺少那个库的,最后终于把库的依赖补齐了,最后又提示SSL模块有问题,无奈,又要下载SSL的源码编译安装,然后又是重复上面的一堆,最后把原先的Python都搞崩溃了,这些依赖关系真的让人崩溃,从此之后,如果apt,rpm不能解决的,需要源码编译安装的,我都敬而远之。给大家一个劝告,不要迷失在Linux无尽的依赖中,就我目前碰到的很多Linux问题中,版本和依赖基本占据了90%以上,一个软件在一个Linux发行版上跑不起来的时候,不要勉强了,最好的办法是尽快找到对应的系统版本,直接换系统会比你折腾这些来得快得多,千万不要相信什么编译安装,除非你有功夫折腾,我至今还没遇到能一次性无报错跑完的编译安装,一些是A依赖B,B依赖C,C依赖A这种死锁逻辑,还有一些则是A依赖B的高版本,B依赖A的低版本这种无脑依赖,另外就是无尽的依赖,A要更新B,B要更新C,C又依赖D,最终要把整个系统都更新一遍才能运行出来吧,说这么多,主要还是希望让读者能把精力手头亟待解决的事情上,不要在解决Bug的时候迷失自我。

经过与bug的不懈斗争,我终于顺利地把UEFI编译了出来,一看编译结果,又傻眼了,编译出来这么多文件,到底是刷哪个呢?嗯,先从大的开始看吧,根据直觉,应该是FVMAIN.Fv,FVMAIN_COMPACT.Fv ONECLOUD_EFI.fd,应该是这几个之一了,经过查询相关资料:

1. FD (Firmware Device)

整个BIOS ROM 就是一个FD,即Firmware Device。

2. FV (Firmware Volume)

整个BIOS ROM 又被分成多个小的逻辑区块,这就是FV,即Firmware Volume。

每个Firmware Volume Image包括 Header 和 FFS Image, 还有Free Space。

3. Firmware Files

Firmware Files 就是存储在FV上的数据或代码。

而 FFS (Firmware File System) 就是描述在FV 上 Firmware Files 和 Free Space 是如何组织的。

每个FFS Image包括Header 和 File Sections。

4. Firmware File Sections

Firmware File Sections 就是在Firmware File上特定的File Type里独立的,不连续的段。

每种类型的Section都存储特定的数据。比如PE32类型的Section存储的是代码。而RAW类型的Section则存储包括ACPI Tables这样的纯数据。段的类型很多。甚至允许存储另一个FV的压缩。这另一个FV如果被解压缩,就又是一片天地了。

嗯,东西是蛮对的,但是说人话不好吗?

我左看看,右看看终于把这个搞明白了,UEFI在编译各个包时,生成了很多FFS文件,FFS文件的集合,生成了FV文件,FV文件经过压缩,生成了FVMAIN_COMPACT.Fv,FVMAIN_COMPACT.Fv再经过打包,生成了FD文件,这样看起来大概就是FD是整个磁盘的镜像,FV是分区,FFS就相当于文件,我是这么去理解的,由于这里只有一个分区,FV和FD没有太大的差别。具体的分析过程使用到了WinHex,查看Build脚本,再加上自己的假设,猜想,证实,这些具体有时间再补充。

最终得出来了FD是最终的生成文件,满心欢喜地把它刷入了SD卡中,嗯,不出所料,什么反应都没有。手摸cpu,一点发热也没有,看来程序是彻底地跑飞了,我也没想着能有什么奇迹,能输出些乱码什么的,能发发热,证明这个程序至少是在运行了,目前看来,连运行都是个问题。经过看WoA源码,发现其在FD的基础上再经过了一次打包,想着是不是格式不对?FD是不是不能直接运行?查询到U-Boot的bootm命令,和go命令能启动Linux kernel镜像,我又尝试了直接将FD文件放入SD卡,启动到U-Boot命令行,用 mmcinfo; fatload mmc 0 12000000 ONECLOUD_EFI.fd 将文件加载到内存上,结果就是bootm提示不识别镜像,不是linux kernel,go命令则是直接重启了。

未完待续

《玩客云Amlogic S805 适配Win10 arm32记录 – 1》有1条留言

留下评论