关于uboot如何找内核,内核如何找根文件系统的个人见解

时间:2022-05-10 09:00:18

关于uboot如何找内核,内核如何找根文件系统的个人见解

 

这几天真算是让这个辰汉给搞趴下了,唉。也没有资料可以参考。一点信息也不说,弄不弄就把Freescale的东东拿出来。而你的东东又跟原厂的不一样。我真CAO了。

为了将这些映像搞进NAND中,哥我彻夜未眠啊。还有,那个网卡驱动现在都不好用。网络不行啊。

 

还是以i.mx53处理器为例吧。我估计别的也差不多。i.mx53根据GPIO引脚的高低电平决定从哪个外设引导。手册上有说明的,就是几个拨码开关,通过上拉、下拉电阻搞个高低电平,让处理器在复位时采样,决定如何引导。

当从NAND引导后,应该uboot烧写在Nand Flash0x0起始地址处,所以起初先执行ubootuboot会以两种格式进行交互。一是开机的时候直接任意按一个键,进入命令交互模式,类似于linux下的shell。另一种是直接默认使用bootcmd进行加载。而我们进入命令交互模式就是为了定制bootcmd命令,实现开机加载uboot,通过uboot加载内核,通过内核加载rootfs

uboot中有几条重要的命令,如下:

1mmc read 1 ${loadaddr} 0x800 0x1800;bootm

      Mmc read 这条命令相对于nand read,而在i.mx53平台下Nand Flash是通过MMC接口访问的,在uboot中通过MMC实现了Nand Flash的访问。

这条命令的作用是:读取1MMC设备(即Nand Flash)中,从0x800地址开始,大小为0x1800的内核数据至内存${loadaddr}地址处。

不过我就一直没有搞明白0x1800/1024=6KB,内核不可能这么小????

Bootm就是直接跳至内存${loadaddr}地址去执行了。

这个默认的${loadaddr}我在uboot-imx/include/configs/mx53_smd.h文件中找到了,定义如下:

#define CONFIG_LOADADDR           0x70800000

查看了别的文件mx53_arm2_ddr3.hmx53_ard.h也是这个值。可能是官方定义的默认值。

还有一个地方不明白,不是说使用mkimagezImage加上64个字节的uboot头部吗?而加了之后真正的内核入口地址应该是偏移64个字节?这里怎么没有体现出来啊????

 

2setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk0p1 rootwaitrw ‘

       这一条就是uboot传输给内核的参数,这些参数会存放在NAND Flash提前协商分区好的扇区上,内核启动的时候会去特定的地址去读取这些内核参数。

       而这里最最主要的也是 root=/dev/mmcblk0p1 ,这就是根文件系统的挂载点。为什么要这样写呢?这样写内核能找到根文件系统吗?为什么不直接写根文件系统在NAND Flash的起始地址呢?

       哈哈,问题就在这里,我们都写过LDD3中的hello world,都知道在linux一切都是文件,只要是设备,肯定就对应一个设备文件。而内核对文件系统也不例外。内核把文件系统也当成一个设备,通过特定的设备节点进行访问。

       那文件系统都没有挂载,光有一个设备节点有什么用?

       哈哈,这个问题问得好。我都思考好长时间了,这里告诉大家。还记得NANDFlash的分区吗?我们将其划分为好几个区,bootloaderkernelrootfsuserfs等。这些分区都对应于Nand Flash上的物理空间,内核挂载文件系统是通过内核中的NAND Flash分区表进行的。当读取完毕后,再通过内核参数root=/dev/mmcblk0p1设备节点进行交互。

       当然,这些只是理论上的,也是这几天鼓捣i.mx53总结下来的,还是要奉劝几位,买评估板一定得买原厂原货,资料多,有技术支持。不要贪图小便宜,买个仿造的,唉。IT屌丝男,伤不起啊。

 

晚上,继续加班,搞网卡驱动。唉,怎么就不好使呢。。。。。。。