痛苦编译xv6

我竟然以为xv6可以一次性编译成功。结果6个小时就这么过去了。从官网下载了xv6源码。编译时说没有qemu,那就先下载编译qemu。一开始没多想,直接configure,不出意外的提示缺少各种库,什么zlib,glib,pixman。安装完,make。结果一个半小时后见。后悔当时没加个-j8。

好不容易编译成qemu,xv6竟然跑不起来….图形模式提示链接vnc,命令行模式卡在booting from hard disk。天煞,看了help才知道,qemu不会自动提示安装GUI组件。我需要手动准备好SDL2。折腾过后,还是卡在了GUI的booting from hard dist,而且那个小窗口一直闪…好在我想起来可以不用多平台支持,加上-j8,节省了大量编译时间。

接着又是一个小时的网上挖掘,没找到任何有效方法。倒是在xv6说明页面不起眼处看到一行字,大意是他们自己打包了一个qemu….这我当然认为是qemu不兼容或者出bug。

于是我又git clone了xv6专用的qemu结果…clone竟然卡了。

试过从不同的主机上下载,都卡了。不过在我偶然去了趟厕所之后,它就clone好了….果然有解决不了的问题就要先去趟厕所。

此时又迎来了新问题。gcc7没法编译这个旧版源码。首先是minor major宏,这个还好解决,直接在源码多加了两个#include。后面这个就麻烦了,format-truncation报警。折腾半天我决定回退gcc到版本6…为了方便,我直接卸了gcc7…

专用qemu算是编译好了…结构xv6还是报错…triple fault。额,这个东东貌似机理还有点复杂,是cpu级的异常。经过一番挖掘,解决方法就是加一个编译参数,-fno-pic。这个pic指的是Position-independent code,有兴趣可以了解一下。结果xv6就真的跑起来了…额,不过图形界面貌似还是打不开…原来旧版使用的sdl1.2。

这时我就想,那原生的qemu到底有什么问题?

经过一番折腾。换回了原生qemu……xv6竟然成功运行了。

原来所有问题就出在 -fno-pic。至于原生qemu为什么不报错,那就是个悬案了。难道这就是他们自己打包的原因?

困哉。

Leave a Reply

Your email address will not be published. Required fields are marked *