Linux之所以被称为操作系统,肯定是需要有引导程序来启动各个关键外设的运行,这里可以和个人电脑PC做个类比。我们在开机的时候是不是先要进入BIOS,BIOS在初始化硬盘、内存、USB接口、网口等之后,才可以进入Windows系统对吧?当然现在的电脑BIOS的引导是感受不到的。这里的BIOS就相当于一个bootloader引导程序,所以Linux也需要这样的bootloader。实际上,一个完整的Linux操作系统就是由Bootloader+Linux内核(Linux Kernel)+根文件系统(rootfs)这三大部分组成的。
关于Uboot移植,我是完全按照正点原子的教程来一步步学习和实际练习的,但是碰到了几个坑花了很长时间才搞明白并解决,所以这一篇笔记想重点记录这几个坑的解决过程,也可以让其他碰到类似问题的伙伴能多个参考。
第一个坑也是最大的坑,就是网络配置。我开发板和PC是用网线直连的,PC通过无线网卡上互联网,这个方式估计是很多初学者的标配吧,但就是这个方式给我造成了很长时间的困扰。最容易出现的问题就是无法ping通开发板和Ubuntu虚拟机,Ubuntu和PC机也无法互相ping通,甚至出现了刚设置好可以ping通了,一重启虚拟机又不行了的奇妙现象,这就使得NFS服务和TFTP服务无法正常使用,也就没办法实际练习内核的启动。在网络上找了很多所谓的教程,发现都无法彻底解决此问题(深深觉得CSDN就是一个你抄我的、我抄你的抄袭论坛)。最后还是自己研究了虚拟机和PC机的网络设置,还算成功的搞定了。但是我的这种方法在虚拟机、PC机和开发板都互相ping通的情况下,虚拟机是无法联互联网的。
首先要确保PC和虚拟机可以互相ping通,只要这两个能互通,开发板再设置在同一网段就没问题了。
-
在PC的以太网属性中,必须不要勾选
Microsoft LLDP协议驱动程序
;
-
在以太网属性的IPv4中指定IP地址,例如192.168.0.xx
-
进入Ubuntu主机的
虚拟网络编辑器
,点击更改设置
-
红线位置选择你PC的有线网卡,注意是有线网卡。正是这一步设置使得虚拟机无法连上互联网,而且网络连接的图标上会有个问号。所以如果有需要利用虚拟机上网的,在这里选择已桥接至自动即可。
-
在虚拟机设置的网络适配器中选择桥接模式
-
在虚拟机的
设置-网络-有线连接
中,IPv4选择手动,并输入和PC同网段的IP地址
-
这时候应该就差不多了,先在终端打一下
ifconfig -a
,看看网卡有没有设置地址成功。
继续在终端里ping PC主机:ping 192.168.0.xx
,其中xx是自己设置的PC机以太网的IP地址。
也可以在PC主机里ping虚拟机。
注意:主机和虚拟机互相ping的时候一定要把网线插到开发板,开发板必须打开电源! -
利用boot阶段设置开发板的IP地址等环境变量,使用
setenv
命令和saveenv
命令,就按照正点原子的教程操作即可,当然也要用192.168.0
网段。到这里基本就没问题了。
还有个坑也是困扰我了几天,但原因其实很弱智,就是使用NFS挂载根文件系统时,IP地址后面和绝对路径之间不能有空格,否则NFS挂载不了根文件系统,Linux系统启动不起来,就是下面这句指令。
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.12:/home/xxx/linux/nfs/rootfs,proto=tcp,nfsvers=3 rw ip=192.168.0.13:192.168.0.12:192.168.0.1:255.255.255.0::eth0:off'
192.168.0.12:/home/xxx…冒号和/之间不能有空格~~
正点原子其实提供了适配他们开发板的U-boot,Kernel和根文件系统,也基于NXP提供的原版文件进行了适应开发板的修改,建议按照教程一步步的基于原版文件进行修改,会有不一样的收获。
接着会进入到Linux驱动开发的学习,这也是最重要的部分了。
(未完待续)