TA的每日心情 | 奋斗 2017-5-23 16:15 |
---|
签到天数: 12 天 连续签到: 1 天 [LV.3]偶尔看看II
|
本帖最后由 cruelfox 于 2017-4-23 08:49 编辑
进展并不是预想的那样顺利。
没拿到板子之前我以为板子上会附带一个可以启动的文件系统,拿到板子却发现并没有焊接eMMC,需要自己用Micro SD卡来启动。据说前一批的发放附带了一个写好系统的Micro SD卡,我收到的盒子里确实没有带。既然Ubuntu linux支持这个板子,那第一步弄一个现成的系统先跑起来应该不是问题。版上早已经有朋友运行起来并安装软件测试了。
按照ESPRESSObin wiki网站的链接下载了 ubuntu-base-14.04-core-arm64.tar.gz 这个文件,几十兆不费多少时间。因为我日常主要用的这台电脑是WinXP系统,把SD卡做成Linux文件系统不方便,所以把笔记本电脑拿出来运行Linux. 先解包 ubuntu 这个 tar.gz 文件,发现 boot 目录下面竟然是空的!原来没有包括内核呀。
印象中 wiki 上没有说从哪里下载内核的文件,只是介绍了怎么编译内核。我又在 wiki 网站找了一次,的确没有。那就不得不改变计划,先自己编译一个内核来用了。需要两样东西:交叉编译的工具链(cross-compile toolchain),因为是在X86的平台上编译出ARM的可执行代码;以及内核的源代码。这两部分怎么获取在 wiki 上已经说了。工具链可以下载到,我已经实现下好了,这回传到我的Linux机器上,然后用tar截开。接下来,先运行一下这里面的 gcc 试试。结果呢,不能执行?我靠,什么情况?
用 file 看了一下,这是 x86_64 的可执行文件,但我的Linux是32位的啊。呃,本人不折腾Linux已多年,这个系统还是在学校的时候编译的,软件版本都很老了。再上下载URL中的网站找了找,确实没有 i686- 的版本啊。只好远程登陆到办公室的linux机器上去编译了,那机器的系统是64位的。SSH把文件传过去,解包,试 gcc,又出现意外了!GLIBC的版本不支持。公司的linux软件版本也老了啊,但我没有root权限不能升级,作罢。
在我的笔记本上再装一个64位的Linux发行版?也很折腾。那么就自己编译一套 Cross-compiler 吧。我玩Linux是使的 LFS (Linux From Scratch),该网站上介绍各种软件如何从源代码编译介绍得比较充分。其中一个分支是 CLFS,介绍交叉编译系统。可惜今天CLFS的服务器有点问题,只好搜索引擎找一下了。参考制作交叉工具链的步骤 http://clfs.org/view/clfs-embedded-0.0.1/arm/cross-tools/chapter.html
我选择了 GCC 5.2.0 版本( ESPRESSObin wiki 网站下载链接的编译好的工具链是 5.2.1 版本,接近),在 LFS 7.8 版本中可以找配套使用的 Binutils, GMP, MPFR 等软件包 http://ftp.osuosl.org/pub/lfs/lfs-packages/7.8/
交叉工具链有两个主要组成部分:汇编及连接工具(binutils)和C语言编译器(GCC),因为目的是编译内核而不是应用程序,就省去了GLibc. 先编译 binutils-2.25.1, 参考CFLS中的步骤:
第一步是configure, 执行
$./configure --prefix=/cross-tools/ --target=aarch64-linux-gnu --with-sysroot=/cross-tools/arm64 --disable-nls --disable-multilib
因为是交叉编译,必须要指定 --target=aarch64-linux-gnu 参数。然后编译:
$ make configure-host
$ make
没问题就可以安装了(已指定安装到 /cross-tools 目录下)
$ make install
然后编译 GCC, 需要 gcc, mpfr, mpc, gmp 四个软件包。其中后三个要释放到 gcc 的源码目录下,重命名去掉版本号。
也是先configure, 执行
$ ./configure --prefix=/cross-tools --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=aarch64-linux-gnu --with-sysroot=/cross-tools/arm64 --disable-nls --disable-shared --without-headers --with-newlib --disable-decimal-float --disable-libgomp --disable-libmudflap --disable-libssp --disable-libatomic --disable-libquadmath --disable-threads --enable-languages=c --disable-multilib --with-arch=armv8-a
然后就编译和安装:
$ make all-gcc all-target-libgcc
$ make install-gcc install-target-libgcc
接下来终于可以按照 wiki 中的步骤编译内核了。
内核编译过程比较长,从输出的信息看来,许多不需要的模块都被选择了。
呃,出错了!重新make, 确定出错位置
在 efi/libstub 这里出了问题。不知道是编译器的问题还是我的Linux的问题还是配置的问题。现在考虑怎么跳过去,EFI? 需要吗?重新 make menuconfig 一下,在主菜单 "Boot Options" 进去,把 "UEFI runtime support" 关掉试试看吧。
然后再make,等待…… pass了,查看下生成的文件。
把内核文件和 .dtb 文件都复制到Micro SD卡上,准备启动板子。u-boot上面的命令就按照wiki的来,先不管什么含义了。
编译的内核成功运行了,后面的信息中看到 Ubuntu 的初始化也执行了,不过有一点问题:最后没有出现登陆界面
后来查到问题了,是在编写 ttyMV0.conf 的时候 copy-paste 丢了第一行首字母s.
改正后就能登陆root shell了。
|
|