3.4.4 安装根文件系统到目标系统
接下来,我们需要将文件系统安装到虚拟机上,来配合内核进行启动。
当然,如果为了减少共享库和二进制可执行文件的大小,可以使用i686-none-linux-gnu-strip命令删除ELF中运行时不需要的符号,命令如下:
但是一定不要对crt*.o等这些启动文件进行strip,因为这样会删除目标文件的符号表,导致链接器在链接时找不到符号。
接下来我们使用scp命令,将文件系统复制到虚拟机上。因为命令scp会跟随符号链接,因此,我们首先将文件系统打包,然后再使用scp命令进行复制:
在复制完成后,在虚拟机上解开压缩包:
重启系统后,如果一切顺利,用户空间的程序/bin/sh会顺利运行,如图3-28所示。
图 3-28 系统启动后进入shell
至此,一个基本的内核已经构建完成了。它可以运行在x86体系架构上,可以驱动Intel的SATA硬盘,可以识别EXT系列文件系统,并内置ELF文件加载器,最后成功运行了用户空间的程序bash。
当然,这仅仅是个开始,我们才刚刚上路。读者可以根据需要继续扩展内核功能,比如,后面为了支持网络,我们配置内核支持TCP/IP协议、配置内核支持网卡驱动等。但是,通过这一过程,我们也看到,从头开始编译一个内核并非如想象般困难。虽然内核包罗万象,支持不同的体系结构,有着成千上万的选项,包含数不清的驱动,这些都让内核看起来无比复杂,但是不要被这些表象迷惑,只要以目标为导向,再加上一点耐心,配置一个高效的内核不再是梦。