一般来讲启动一个系统所需的bootloader(SPL/MLO、u-boot.img)和根文件系统(/boot下包含内核zImage)要么是放在NAND Flash,或者是SD卡,或者是eMMC,或者是USB中,那么还有一种方式,就是所需要的这些文件全部都不在板子上,而是放在其他的电脑或者说服务器上。这样即使板子上没有eMMC也照样跑系统!而且由于根文件系统在NFS服务器上,使得板子上的系统的“硬盘空间”变得十分充足!
关于一个系统的启动流程相关参考资料
内核源码的说明文档,关于NFS启动一些需要注意的
https://www.kernel.org/doc/Documentation/filesystems/nfs/nfsroot.txt
1、ROM-Code如何从串口获取bootloader?
对于BBB板子来说,当没有按住boot按键时,启动顺序是MMC1、MMC0、UART0、USB0,而按住boot按键时启动顺序为SPI0、MMC0、USB0、UART0。由于板子的MMC1已经接有eMMC,所以要想让ROM-Code从串口启动,那么断电时,拔掉SD卡,然后按住boot按键,再给板子上电,如果连接上了串口调试线,此时PC机串口应该不停的收到字符CCCCCC,这就表示ROM-Code在向串口请求SPL文件(PC机的串口调试工具推荐SecureCRT)。此时用Xmoden协议将SPL文件从串口发送过去,接着串口上会显示传送进度和速度。传送完后串口会又会收到字符CCCCCC,这就表示传送过去的SPL已经运行,并向串口请求u-boot.img文件,此时用Ymoden协议将u-boot.img文件传送过去,接下来从串口可以看到u-boot已经启动,但由于没有内核和根文件系统,所以u-boot自动停止,显示出命令行交互界面#u-boot:
至此ROM-Code和SPL任务完成,接下来控制权转交给u-boot。
2、u-boot如何从TFTP服务器获取内核镜像,从NFS服务器挂载根文件系统?
首先要在同一局域网内的一台PC机上配置TFTP和NFS服务器,比如可以在虚拟机ubuntu12.04中配置TFTP和NFS服务器,注意,虚拟机和宿主机一定要选择桥接模式,以使虚拟机和目标板获得同一网段的IP。
相关参考:
以上配置完成后都进行都本机测试tftp localhost、mount -t nfs -o nolock localhost:/nfs/dir/ /mnt/nfs,或者用开发板来测试,以确保配置没有问题。
准备工作都做好之后,现在u-boot#命令交互等待用户输入,该如何配置环境变量让u-boot通过TFTP协议下载内核到内存,下载到哪个位置?传递什么参数给内核来让他知道根文件系统在哪里?下面来对此进行分析:
进入u-boot后,输入printenv,回车,得如下输出,
U-Boot# prin