既然是杂谈,内容就比较轻松一点。这里没有教你们怎样一步步去针对新的硬件平台去修改U-Boot代码(说真的,要想学这些仍是去看U-Boot的文档比较靠谱),在这我只是泛泛的侃侃Bootloader和怎样生成针对Beaglebone的bootloader,嗯,闲话少叙,这就开始。操作系统
先说说Beaglebone的boot过程
大部分处理器的BOOT过程都要经历多个阶段,所谓的“chained loading method”,每一步新的bootloader都完成一些CPU初始化工做,加载下一步要运行的程序,而后将CPU的控制权彻底转交。
对于Beaglebone平台来讲,其使用的是AM335x系列的CPU,系统boot过程分为四大步:
1)处理器PoR(power-on reset)后就会跳到复位向量所指的程序段去运行,这段程序位于处理器的ROM中,由处理器生产厂商提供,咱们称其为ROM Boot Loader(RBL)。RBL在初始化固定存储设备(NAND Flash,MMC,Etc.)后,根据CPU的跳线选择,从持久性存储设备中将第二部要用到的bootloader读入内存(至因而内部仍是外部,要根据ROM中的程序来定,Beaglebone是内部ram),然后将控制权转交。
2)这一步的bootloader咱们称为Secondary Program Loader(SPL),固然这是TI的叫法,你也能够称其为xloader,UBL。SPL完成有限的初始化工做,最重要的就是初始化DDR RAM(或是其余大一点的外部RAM),由于下一步的U-Boot将要进驻其中。在这以后,SPL从持久性存储设备中将U-Boot(其余bootloader也行,咱们这里以U-Boot为例)读入DDR RAM中,随后转交CPU控制权。
3)终于到了万众瞩目的U-Boot阶段,使能大部分的处理器功能,将操做系统内核读入DDR RAM中,然后配置启动参数启动Linux内核。固然U-Boot的功能可不止这些,U-Boot中提供了不少应用程序,可使用tftp下载文件,或是格式化存储设备等等。
4)Linux内核启动……内核初始化,MMU使能,外部设备初始化,PID(1)Init进程启动……
WHY 4 STEPS?
好了,那可能有人会问,搞得那么麻烦干吗?一步Boot起来不行吗?>_< 其实任何一门技术都是让咱们的生活变的简单,Bootloader也是,因此其不多是麻烦……首先,第一步的RBL不可能太复杂,ROM大小是一个限制,最重要的仍是由于其所能获取的系统信息太少,因此处理器只能使用简单的方法去寻找能完成复杂功能的代码,然后将处理器初始化工做交给它来完成。其次,SPL也不能很复杂,由于其位于处理器的内部RAM中,通常处理器的内部RAM都要小于128KB,其大小注定其不能完成很复杂的功能,是故,再寻找能力更强大一些的代码,将处理器初始化工做交给它来完成。到了在DDR RAM中执行的Bootloader(U-Boot算一个),其功能就比较完善了,此时就能够启动操做系统了。
最后上两张图:.net
图1 Beaglebone boot图解
图2 硬件跳线提示RBL从何处读取SPL进程
下面就该说说U-BOOT了内存
U-Boot全名是DAS U-Boot,一看就是德国佬作的,DAS吗…… 背景就很少介绍了,你们本身Google吧。
处理器在BOOT的前三个阶段都是不适用MMU的,也就是说在此三个阶段运行的程序,都是直接访问处理器的物理地址,只有到操做系统进行MMU初始化后,虚拟地址地址系统才算启动。为何说这个?若是你们写了裸机程序想使用U-Boot加载运行,别忘了在编译的时候指明要加载的硬件地址!
U-Boot 主要完成的功能有:
1)初始化处理器时钟,设置pin mux。
2)读取内核镜像。
3)使用用户指定的内核启动参数启动内核。
今天先到这里,有点不舒服…… 文档