
1.为什么是uboot?
1.1、计算机系统的主要组件
(1)计算机系统是以CPU为核心运行的系统。典型的计算机系统包括:PC(台式笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(电饭煲、空调之类的家用电器)。
(2)计算机系统有很多组件,不同的计算机系统有不同的组件。但是所有计算机系统需要的主要核心组件是三样东西:
CPU外部存储器(闪存/硬盘)内部存储器(DDR SDRAM/SDRAM/SRAM)
1.2、PC启动过程
(1)部署:典型PC的BIOS程序部署在PC的主板上(主板出厂时已经预制好),操作系统部署在硬盘上,断电时内存没有影响,断电时CPU不工作。
(2)启动过程:PC上电后,首先执行BIOS程序(实际上PC的BIOS是NorFlash)。BIOS程序负责初始化DDR内存和硬盘,然后从硬盘读入OS镜像到DDR,然后跳转到DDR执行OS,直到启动(OS启动后BIOS就没用了)。
1.3、典型嵌入式linux系统启动过程
(1)典型嵌入式系统的部署:uboot程序部署在Flash上(可以作为引导设备),OS部署在Flash上(在嵌入式系统中替代硬盘),断电时内存没有影响,断电时CPU不工作。
(2)启动过程:嵌入式系统上电后,先执行uboot,然后uboot负责初始化DDR,初始化Flash,再从Flash读取OS到DDR,然后启动OS(OS启动后uboot就没用了)。
总结:嵌入式系统和PC的启动过程差不多,只是BIOS变成了uboot,硬盘变成了Flash。
1.4、android系统启动过程
(1)1)Android系统的启动和Linux系统几乎一样(上面说的典型嵌入式系统启动)。几乎一样是指和之前完全一样,但是内核启动后加载根文件系统后就不一样了。
(2)引导可以分为两个阶段:第一阶段是uboot到OS引导;第二步是将操作系统加载到rootfs中,并在命令行上执行它。现在主要研究第一阶段,android和linux的启动区别在第二阶段。
1.5、总结:uboot到底是做什么的?
(1)uboot主要用于启动操作系统内核。
(2)uboot还负责部署整个计算机系统。
(3)uboot在Flash等板上也有操作硬盘的驱动。
(4)uboot还需要提供命令行界面,供人们操作。
2.为什么是uboot
2.1、 Uboot从何而来?
(1)uboot是SourceForge上的开源项目。
(2)uboot项目(2)作者:最早由德国人发起的项目。
(3)uboot是一个人发起,然后全网所有感兴趣的人共同维护开发的bootloader。
2.Uboot的发展
(1)自己用的小型开源项目。
(2)被更多的人认可和使用。
(3)默认由SoC厂商支持。
总结:经过多年的发展,uboot已经成为事实上的行业bootloader标准。现在大多数嵌入式设备都会默认使用uboot作为引导加载程序。
2.3、uboot版本号问题
(1)早期uboot的版本号和这个差不多:uboot1.3.4 .后来版本号变成了和uboot-2010.06差不多。
(uboot的核心部分几乎没有变化。新版本支持更多开发板。对于一个老版本的芯片,新旧版本的Uboot没有区别。
2.4、正确理解Uboot的可移植性
(1)uboot是universal bootloader(通用引导代码),也就是说它可以在任何地方使用。所以uboot是可移植的。
(2)uboot可移植性不是说uboot可以随便用在任何开发板上,而是uboot具有源代码级别的移植能力,可以针对多个开发板进行移植,移植后就可以用在这个开发板上。
3.3.uboot必须解决哪些问题?
3.1、可以自己直接启动。
(1)通用SoC支持多种启动模式,如SD卡启动、NorFlash启动、NandFlash启动等.uboot必须根据SoC的具体启动设计来设计。
(2)uboot必须改变和移植硬件对应的代码级别,以保证可以从对应的引导介质启动。这个块在开始时被特别处理。uboot第一阶段的s文件。
3.2、可以引导操作系统内核并将参数传递给内核。
(1)1)uboot的最终目的是启动内核。
(2)在设计的时候,2)linux内核被设计为可以被传递。也就是说,我们可以提前在uboot中为linux内核准备一些启动参数,放在内存中的特定位置,然后传递给内核。内核启动后,它会去这个特定的位置获取uboot传递给它的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。
3.3、可提供系统部署功能。
(1)uboot必须能够被人使用,完成整个系统的刻录和下载(包括uboot、内核、rootfs等的镜像。)在闪存上。
(2)裸机教程中的刷机(ARM裸机第三部)就是利用uboot中的fastboot功能将各种镜像刻录到iNand中,然后从iNand启动。
3.4能够管理soc级和板级硬件
(1)某些硬件的控制能力是在uboot中实现的(有些硬件是在uboot中初始化的),因为UBOOT必须让这些硬件工作才能完成某些任务。例如,uboot必须能够驾驶in和以便刷机。比如uboot要想刷机时在LCD上显示进度条,就必须能驱动LCD。比如uboot如果能通过串口提供操作接口,就必须驱动串口。比如uboot必须驱动网卡芯片才能实现网络功能。
(2)SoC级(如串口)是SoC的内部外设,板级是SoC外部开发板上的硬件(如网卡和iNand)。
3.5、uboot的“生命周期”
(1)uboot的生命周期是指:uboot什么时候开始运行,什么时候结束运行。
(2)uboot本质上是一个裸机程序(不是操作系统)。uboot一旦启动SoC,就会简单的运行uboot(意思是uboot运行的时候其他程序不能同时运行)。一旦uboot运行完毕,就无法回到uboot了(所以uboot本身在启动内核后就死掉了,如果想再看到uboot界面,只能重启系统。重启不是复活刚才的uboot,重启只是uboot的另一个生命)
(3)uboot的入口和出口。uboot的入口是自动启动,唯一的出口是启动内核。Uboot还可以执行很多其他的任务(比如烧系统),但是在其他任务执行完之后,你可以返回uboot的命令行继续执行uboot命令,而一旦执行了启动内核命令,就不能再回来了。
总结:一切都是为了启动内核。
4.4.uboot如何工作
4.1、从裸机程序映像uboot.bin开始
(1)uboot本质上是一个裸机程序,和我们裸机全集里面写的那些裸机程序xx.bin没有本质区别。如果一定要有区别的话,那就是:我们写的大部分是16KB以内,而uboot是16KB以上(一般uboot在180 K到400 K之间)。
(2)uboot本身是一个开源项目,由几个。c文件和。h文件。配置编译后会生成一个uboot.bin,是裸机程序uboot的镜像文件。然后,这个镜像文件被合理地烧录到引导介质上,并带到SoC上进行引导。也就是说,uboot在不运行的时候是以uboot.bin的形式出现的,一般位于启动介质中。
(3)uboot运行时将被加载到内存中,然后一次一条指令将被带到CPU中运行。
4.2、uboot的命令式shell界面
(1)普通裸机程序运行时直接执行,执行的效果与代码有关。
(2)有些程序需要与人交互,shell(shell是在程序中实现的(shell是提供人机交互的接口,回忆一下《裸机ARM全集》第十六部),uboot实现了一个shell。
注意:外壳不是操作系统,与操作系统无关。在linux中打开一个终端后,你会得到一个shell,你可以输入命令并按回车键执行它。uboot中的shell工作方式很像linux中的终端shell(其实差不多,只是命令集不同。比如linux中可以使用ls,但是uboot中不识别ls)。
4.3、掌握uboot的两个关键点:命令和环境变量。
(1)uboot启动后的大部分时间和工作都是在shell下完成的(比如uboot需要在shell下输入命令来部署系统,在命令行下设置环境变量,在命令行下键入命令来启动内核)。
(2)命令是uboot的shell中可以识别的各种命令。uboot中有几十个命令,有些是常用的,有些是不常用的(我们也可以自己给uboot添加命令),后面会花几节课依次学习uboot中常用的命令。
(3)uboot环境变量和操作系统环境变量的工作方式几乎相同。Uboot的设计是借助了操作系统的设计理念(命令行从linux终端的命令行工作,环境变量来自操作系统,uboot的驱动管理几乎完全复制了linux的驱动框架)。
(4)环境变量可以认为是系统的全局变量,环境变量的名字内置在系统中(知道就知道,不知道就不知道,这部分是系统默认的环境变量,比如PATH;但是有些环境变量是我们自己加的,自己加的系统不知道,但是我们自己知道)。系统或我们自己的程序可以通过在运行时读取环境变量来指导程序的运行。这种设计的优点是灵活性。比如我们想让一个程序改变它的运行方式,不需要修改程序代码重新编译,只需要修改相应的环境变量就可以了。
(5)环境变量是运行时的配置属性。
5.uboot的常用命令1
5.1、行缓冲区命令行类似于linux终端
(1)行缓冲是指当我们向终端命令行输入命令时,这些命令并没有被系统立即识别,而是缓冲到一个缓冲区(即系统认为我们还没有输入完)。当我们按回车键(换行符)时,系统认为我们已经输入完毕,然后把刚刚输入到缓冲区的命令全部拿去分析处理。
(2)linux终端设计有三种缓冲机制:无缓冲、行缓冲和全缓冲。
(3)有些命令有简化别名,比如printenv命令可以简化为print,比如setenv可以简化为set。
(4)有些命令会带参数(注意格式是固定的),uboot的每个命令都有事先指定的各种格式。有些命令就是不带参数,比如printenv/print命令;有些命令带可选参数(带不带参数当然带不带参数执行结果不一样);一些命令采用必需的参数(例如setenv/set命令)。
(5)使用"帮助命令名"查询命令的详细信息。当只输入帮助时,将打印命令列表。
5.2、命令中的特殊符号(如单引号)
(uboot的一些命令有很长的参数。为了告诉uboot这个中间有很多空格的很长的东西对他来说是一个完整的参数,用单引号把这个中间有空格的很长的参数括起来。
(2)其他符号可能存在并具有特定含义。当uboot的命令行有特殊符号时,需要注意的是,这不是错误,可能有特殊含义。
5.3、有些命令是一个命令族(如movi)。
(1)命令族是指很多命令开头使用同一个命令关键字,但是后面的参数不一样,这些命令的功能和作用也不一样。这就是所谓的命令家族。
(2)同一命令族中的所有命令都是密切相关的。比如movi开头的命令族就和movinad(EMMC,iNand)操作有关。
5.4、第一个命令:printenv/print
(1)print命令不带参数,它的作用是打印出系统中所有的环境变量。
(2)环境变量就像程序的全局变量。可以在程序中的任何地方调用或更改环境变量(通常调用)。环境变量和全局变量的区别在于,全局变量的生命周期在程序的第一次运行,开始运行时,在程序结束时诞生和死亡,程序的下一次运行从零开始;但是,环境变量存储在Flash的另一个特殊区域(Flash上有一个环境变量分区)。一旦我们在程序中保存了环境变量,环境变量的值将在下次引导时保持上次更改后保存的值。
6.uboot的常用命令2
1、 Set(添加/更改)环境变量:setenv/set。
用法:set namevalue
2、保存对环境变量的更改:saveenv/save
saveenv/save命令是不带参数直接执行的,它的作用是将内存中环境变量的值同步保存到Flash中环境变量的分区中。注意:环境变量的保存是整体覆盖保存,即内存中的所有环境变量将整体覆盖Flash中环境变量分区的原有内容。
摘要:完全更改环境变量的值需要两个步骤:
步骤1:设置命令来改变内存中的环境变量。
第二步:使用save命令将其同步到Flash中环境变量的分区。
有时候我们只是想测试一下这个环境变量,不想影响下一次引导,就直接设置了,不保存,这样这次当前运行的uboot就已经起作用了,但是下一次引导不保存就会恢复到原来的保存。
3、网络测试说明:ping
(1)命令用法:ping ip地址
注:ping是测试开发板和主机之间的网络链接。请注意以下步骤:
1)先插上网线。
2)首先尝试ping主机窗口。注意Windows中有线网卡的地址设置(设置本地连接)。将主机windows的本地连接IPv4地址设置为192.168.1.10。
3)第三步,确认开发板中uboot的几个网络相关环境变量的值是否正确。最重要的是ipaddr(这个环境变量代表当前开发板的IP地址),必须和主机windows的IP地址在同一个网段。
网段的概念:一个IP地址分为两部分,一部分是网段地址,一部分是网段内的主机地址(子网掩码用来区分哪部分是网段地址,哪部分是IP地址)。当子网掩码为255.255.255.0时,IP地址的前三部分(192.168.1.10)属于网段地址,第四部分(10)属于主机地址。
7.开发板和主机之间的ping
上一课的最终结果是uboot中的ipaddr和主机windows的本地连接地址已经设置为一个网段,但是ping实际上是不可用的。
我也发现了这个现象1、当我把两个网段都从192.168.1.x改成192.168.0.x的时候,会ping一次,第二次就ping不了了;2、有同学说不能ping是因为uboot中的gatewayip没有设置,所以我实际测试了一下,把网管设置到了同一个网段。1.重新测试后,结论是第一次ping成功,第二次不可用。
7.1、开发板运行linux并ping主机窗口。
(1)先把开发板刷成linux QT镜像(刷子见裸机教程第三部分),然后开机进入linux命令行终端。
(2)在linux下,使用ifconfig命令将开发板中linux系统的IP地址设置为与主机windows相同的网段(为了上课方便,以后会固定:主机windows的地址为192.168.1.10,开发板uboot或linux的地址为192.168.1.20,虚拟机ubuntu的地址为192.168.1.141。
(3)这时,开发板ping windows。
(4)在4)窗口中的ping开发板也是可以访问的。
说明:首先开发板和主机的网络硬件不错,网络连接也不错,主机窗口中的网络软件设置也不错。
7.2、开发板运行linux,ping虚拟机ubuntu。
(1)正如我在《linux基础教程》中所说的,有几种方法可以设置
步骤1:将虚拟机设置为桥接模式。
第二步:虚拟机的菜单里有一个“虚拟网络编辑器”,要设置成桥接有线网卡。(默认为自动,自动一般会影响ping。因为现在电脑一般有两个网卡:有线的和无线的。如果选择自动,虚拟机会自动桥接到无线网卡,但是我们是通过有线网卡连接到开发板的,自然无法ping通)。
第三步:在虚拟机ubuntu中设置IP地址为192.168.1.141(静态可以通过/etc/network/interfaces文件设置然后重启;您也可以直接在命令行ifconfig上设置它)
(4)此时,开发板应该可以ping通虚拟机ubuntu了。
(5)此时虚拟机ubuntu中的ping开发板也连接上了。
7.3、开发板使用主机窗口运行uboot和ping。
(1)刚才开发板在运行linux的时候,跟主机windows和虚拟机Ubuntu ping,说明硬件、连接、主机设置都是正确的。
(2)此时开发板重启进入uboot,设置ipaddr和gatewayip,然后ping windows发现还是不行。我怀疑是uboot自己的网络驱动有问题。
(3)然后在同样的情况下试着ping虚拟机ubuntu,理论分析应该也不行,但实际发现是可以的。
7.4、开发板运行uboot并ping虚拟机ubuntu。
Uboot和虚拟机ubuntu互相ping(前提是虚拟机ubuntu设置为网桥,并且网桥连接有线网卡,ip地址设置正确)。
结论:开发板运行的uboot有个小bug,ping windows就不行,ping虚拟机ubuntu就行。
8.uboot通用命令3
8.1、 FTP下载指令:tftp
(uboot本身的主要目标是启动内核。为了启动内核,Uboot必须能够部署内核。为了部署内核,Uboot需要从主机下载内核映像,并将其刻录到本地闪存中。uboot如何从主机(windows或虚拟机ubuntu)下载镜像到开发板?方式有很多种,主流的方式有fastboot和tftp。
Fastboot的方式是通过USB线传输数据。
Tftp是通过有线网络。典型的方式是通过互联网。快速启动是近年来新开发的。
(2)用tftp下载时,uboot实际上扮演了一个tftp客户端程序的角色。主机windows或者虚拟机ubuntu中必须有一个tftp服务器,然后把要下载的镜像文件放在服务器的下载目录中,然后在开发板中使用uboot的TFTP命令进行下载。
(3)有些人习惯在windows中搭建一个tftp服务器,一般是用一些软件(比如tftpd32,用起来比较简单);有些人习惯在linux下搭建tftp服务器。可以参考网盘上虚拟机下载目录下的教程《嵌入式开发环境搭建-基于14.04.pdf》,里面有在ubuntu中搭建tftp服务器的教程,也可以自己搜索教程。(如果直接用我的虚拟机,已经建好了,不用再建了;如果是自己的新衣,那就参考文档构造;如果你的版本和我的不同,构建过程可能会不同)
(4)我的虚拟机构建的时候,tftp下载目录是/tftpboot,要下载的镜像复制到这个目录。
(5)检查开发板uboot的环境变量,注意serverip必须设置为虚拟机ubuntu的ip地址。(环境变量serverip的含义是主机tftp服务器的ip地址。)
(6)然后ping开发板uboot下的虚拟机ubuntu,然后尝试下载:tftp0x30000000 zImage-qt(意思是将服务器上名为zImage-qt的文件下载到开发板内存中的地址0x30000000。)
(7)镜像下载到开发板的DDR后,uboot可以用movi指令刻录镜像。
注意:
如果你使用的是windows下的tftp服务器,那么uboot的serverip应该设置成和windwos下tftp服务器的ip地址相同(在windows下设置tftp服务器软件时有一个步骤让你设置服务器的ip地址,必须和主机windows在同一个网段)。
9.uboot的常用命令4
9.1、SD卡/in和操作说明movi
(1)如果开发板使用SD卡/Emmc/iNand作为flash,那么在uboot中操作Flash的指令就是movi(或者mmc)。
(2)movi指令是一个包含许多子命令的命令集。请帮movi查一下具体用法。
(3)movi的指令都是按movi read和movi write分组的。movi read用于将Innd读入DDR,movi write用于将DDR的内容写入Innd。在理解这些指令的时候,一定要注意涉及到的两个硬件:iNand和DDR内存。
(4)命令movie read { u-boot | kernel } { addr }使用了一种通用的描述方法:movi和read之外没有标记表示每次都需要这个命令;必须为由一对大括号包围的零件选择一个;大括号里的竖条表是选择题;括号[]表示可选参数。
(5)该指令有多种用途,比如movi read u-boot0x30000000,意思是读取iNand中的u-boot分区到DDR的起始位置0x30000000。(在uboot代码中,iNand分为很多分区,每个分区都有地址范围和分区名。在uboot程序操作中,可以用直接地址操作In和分区,也可以用分区名操作分区。);注意,这里的0x30000000也可以直接写成30000000,意思是一样的(uboot命令行中的所有数字默认都是十六进制的,不管你加不加0x)。
9.2、 nand闪存操作说明NAND
理解方法和操作方法与movi指令完全相似。
9.3、内存操作指令:mm,mw,md
(1)1)DDR中没有分区(只听说过分区硬盘和闪存,没听说过分区内存.),但是在使用内存的时候,我要注意,千万不要踩别人。因为uboot是一个裸机程序,不像操作系统是由整个系统来管理所有的内存,而是由系统来负责分配和管理,系统会保证内存不会随便越界。那么裸机程序中的uboot并不管理所有的内存,内存是分散的,随便用的,所以如果程序员(使用uboot的人)自己不注意,可能会覆盖自己的数据。(所以想想我们为什么把uboot放在地址23E00000)
(2)md是内存显示,用来显示内存中的内容。
(3)mw是内存写,将内容写入内存。
(4)mm是memory modify,意思是修改内存中的某个块,或者说白了就是写内存(如果需要批量逐个单元修改内存,mm是最合适的)。
9.4、引导内核指令:bootm,go
(1)uboot的最终目的是启动内核,在uboot中表现为指令。在uboot命令行调用这个指令会启动内核(不管成功与否,所以这个指令是死路一条)。
(2)区别:bootm启动内核同时传递参数给内核,而Go命令启动内核不传递参数。Bootm实际上是启动内核的正宗命令,通常使用;Go命令最初并不是为引导内核而设计的。实际上,go命令内部是一个函数指针,指向一个内存地址,然后直接调用那个函数。go命令的本质是PC直接跳转到一个内存地址运行。Go命令可以用来执行uboot中的任何裸机程序(调试裸机程序的一种方法是提前启动uboot,然后在uboot中下载裸机程序,使用go命令执行裸机程序)。
10.uboot的公共环境变量1
10.1、环境变量如何参与程序运行?
(1)有两个环境变量,一个在Flash中,一个在DDR中。Uboot在开机时一次性将Flash中的所有环境变量读取到DDR中作为环境变量的初始值,然后在使用过程中使用DDR的这个副本。用户可以使用saveenv指令将DDR中的环境变量重写到Flash中,以更新Flash中的环境变量。下次开机时,将再次从闪存中读取。
(2)环境变量在uboot中用字符串表示,也就是说uboot按照字符匹配的方式来区分每个环境变量。所以在使用的时候,一定要注意不要打错字。
1、自动操作的倒计时时间:启动延迟
2、网络设置:ip地址服务器IP
(1)ipaddr是开发板的本地IP地址。
(2)serverip是开发板通过tftp指令从tftp服务器下载东西时,tftp服务器的ip地址。
(3)gatewayip是开发板的本地网关地址。
(4)网络掩码是子网掩码。
(5)ethaddr是开发板本地网卡的MAC地址。
11.uboot的公共环境变量2
11.1、自动运行命令设置:bootcmd
(1)启动后,uboot会自动倒数bootdelay秒数。如果没有人按Enter中断启动,Uboot会自动执行启动命令来启动内核。
(2)当2)uboot自动启动时,实际上是在内部执行环境变量bootcmd的值对应的命令集:bootcmd=movi read kernel 30008000;bootm 30008000
意思是:读取iNand的内核分区到DDR内存的地址0x30008000,然后用bootm启动命令从内存的地址0x30008000启动内核。
(3)设置bootcmd printenv,然后保存env;然后,当您重新启动时,您将看到在倒计时开始后,printenv命令将被自动执行以打印出环境变量。这个小实验说明bootcmd是在启动时自动执行的。
(4)设置bootcmd环境变量:设置bootcmd ' moviereadkernel 30008000;' bootm 30008000 '
11.2、uboot将参数传递给内核:bootargs。
(linux内核启动时,可以接收uboot传递的启动参数。这些启动参数是uboot和内核之间约定的形式和内容,Linux内核在这些启动参数的指导下完成启动过程。这种设计是为了灵活性,这样内核就可以以不同的方式启动,而无需重新编译。
(2)我们需要做的是在uboot的环境变量中设置bootargs,然后bootm命令在启动时会自动将bootargs传递给内核。
(3)环境变量bootargs=console=ttysac2,115200 root=/dev/mmcblk 0 p 2 rw init=/linuxrcrrootfstype=ext3。
含义解释:
Console=ttySAC2,115200控制台使用串口2,波特率为115200。
Root=/dev/mmcblk0p2rw根文件系统在SD卡port 0 device (iNand)的第2分区,根文件系统可读写。
init=/Linux RC Linux的进程1(init process)的路径。
Rootfstype=ext3根文件系统是ext3。
(4)内核参数传递非常重要。新手在移植内核时,经常会忘记给内核传递参数,或者给内核传递错误的参数,导致内核无法启动。
11.3、创建、更改和删除环境变量的方法
(1)创建一个新的环境变量并使用set var value。
(2)更改环境变量并使用set var值。
(3)删除一个环境变量,使用set var。
注意:修改后一定要保存环境变量,否则下次修改就没了。
12.Uboot中Flash和DDR的管理
12.1、uboot闪存分区
(1)所谓分区,也就是说Flash的块管理。
(2)在2)PC等产品中,因为大家都是在操作系统下使用硬盘,所以整个硬盘都是由操作系统管理的,操作系统会使用文件系统来帮助我们管理硬盘空间。(管理保证文件不互相堆叠),所以用户不必太在意分区。
(3)uboot中没有操作系统,对于Flash(相当于硬盘)的管理必须提前使用分区定义(其实uboot和内核中都有分区表,是我们移植系统时对Flash的整体管理和分配方式)。有了这个定义,我们就按照分区定义的方法部署系统,uboot和内核软件也是按照这个分区定义工作的,所以不会错。
(4)分区方法不固定,可以改变。但是在移植手术中,必须事先设计好。一般在设计系统移植的时候就会固定。标准是:
Uboot:uboot必须从Flash的起始地址开始存储(可能是扇区0,扇区1,也可能是别的,看SoC的启动设计)。uboot分区的大小一定要保证uboot肯定能放得下,一般设计成512KB或者1MB(因为一般uboot肯定小于512KB,再大其实也能工作,只是浪费);
环境变量:环境变量分区通常存储在uboot附近,大小为32KB或更大。
内核:内核可以存储在靠近环境变量的地方,大小一般是3MB或者5MB或者其他。
rootfs:
剩下的是空闲分区,通常在内核启动后挂载到rootfs。
总结:一般规则如下:
(1)每个分区都是相互连接的,前一个分区的结束就是后一个分区的开始。
(2)充分利用整个flash,从头到尾。
(3)uboot必须在Flash开头,其他分区的相对位置是可变的。
(4)每个分区的大小由系统移植工程师自己决定,一般确定为一个合适的大小(不能太小,太小容易溢出;不要太大,太大浪费空间)
(5)系统移植前确定分区,uboot和kernel使用相同的分区表。以后系统部署和系统代码中的划分方法一定是一样的。
12.2、 Uboot DDR的分区
(1)DDR的分区和Flash的分区不同,主要是因为断电时Flash是存在的,而断电时DDR就消失了,所以可以说DDR是在系统运行时才部署使用的。
(2)内存的分区主要是在linux内核启动之前。linux内核启动后,内核的内存管理模块会接管整个内存空间,那时候我们就不用管了。
(3)注意,内存分区的关键在于哪块内存必须分配给什么,避免不同功能使用同一块内存造成的互相践踏。比如我们tftp0x23E00000 zImage下载zImage到内存0x23E00000会得到一个错误,因为这个内存其实就是uboot的镜像。此下载将导致下载的zImage从内存中刷新uboot。









