一、问题
如果做过嵌入式linux系统开发的童鞋可以知道,通常我们在开发嵌入式Linux时,如果要在SD卡上安装时要经过:
SD卡格式化------>SD卡分区------->编译MLO、U-boot、Linux内核、根文件系统等等----->复制到SD卡------->插入SD卡并从SD卡启动。
但在上一篇文章中我们可以知道,不需要这些流程,直接将官网系统.img文件用diskImager写进入SD卡就可以了,这是为什么呢?难道这样一个流程就把前面开发流程全部省略了吗?其实并不是。
二、什么是img文件
用直观的理解就是img文件是一个可以代表整个磁盘所有数据的文件,包括一些我们在文件系统下无法看到的磁盘头数据,类似于我们电脑的整个硬盘,如果从这个硬盘启动,我们可以进入操作系统,并看到不同分区下文件系统中的文件,当我们把电脑的整个硬盘拆下来当成移动硬盘时,我们也可以看到相关文件, 但是系统启动分区,引导分区中尽管我们可以看到这个分区,但无法看到这个分区的数据,因为在该分区中的信息是并不是按文件系统格式来的。而我们下载的BBB的img文件就是这样一个文件,其包含两个部分,一个是启动部分,一个是我们内核及文件系统等分区。
三、img文件分析
在电脑上我们可以下载
Winhex来以16进制的形式看到img文件。
1、打开文件
步骤:----打开img文件--->在专业工具中选择将镜像文件转换为磁盘。可以看到以下内容:
2、未分区空间(4M)
在这个大小 为4M的未分区空间中,包含了系统启动时需要的三个重要内容,他们是MBR、MLO及U-boot。他们的位置可以通过这个工具看到。
MBR空间:
https://en.wikipedia.org/wiki/Master_boot_record#PTE
MBR空间是每一个系统盘启动时的主引导扇区,存在硬盘的前512个字节中,主要保存磁盘的分区等信息,从下面红框中的55 AA可以看出这是MBR空间的标志,0x1FF正好是512个字节。
启动代码MLO:
在该空间中,可以看到地址0x0020000处是有文件的,此处的文件是MLO,是AM335X启动时并不是直接启动u-boot的,中间还加了一个步骤是MLO,具体功能将在以后细谈。
U-boot代码:
在地址0x0060000处,存放的时U-boot,从旁边的字符串也可以看得出来uboot的版本。
3、分区1
在这个分区中可以明显看到这里有一个文件系统,包含有bin等linux的系统目录,也是我们在系统运行起来之后,通过Terminal看到的系统文件目录。
由这几个分区,我们可以大致推断出整个系统的启动简要流程:
系统上电时,可以通过磁盘前512个字节中的信息知道系统分区在哪,芯片直接会从0x002000处将MLO复制到内存中执行,然后在0x0060000处复制U-boot到内存中初始化相关硬件,并将加载分区中的内核,从而让系统启动起来。至于系统启动详细流程,我会在后面的内容中详细介绍。
四、总结
本节主要简单介绍了官网提供的.img镜像文件结构,同时推断出了BBB启动时的简要流程,由此我们可以得到:官网提供的.img镜像文件是将已经编译好的MLO、Uboot、内核、文件系统等做成一个磁盘文件,只需要将.img文件原封不动的复制到SD卡中即可成为一张系统盘,其大大简化了嵌入式移植的过程,省去了个人编译Uboot和内核的流程。当然这只是针对BBB,如果在基于BBB做相关硬件扩展同时涉及外部驱动则需要重新编译相关文件。其实对于BBB来说基本已经满足要求了,因为所 有的接口(如spi i2c)都已经引了出来,可以完成
应用层的驱动编译。