uboot学习(1)

来源:互联网 发布:网易云音乐推荐算法 编辑:程序博客网 时间:2024/06/05 09:11

我们的异常向量表放在0地址处,如下图


这个地址就是这个地址,不是随便写的,如果说我的异常向量表要放在这个位置,说白了异常向量表是代码,意思是你这个代码就在0地址??但是打开我们的芯片数据手册的memory map章节,可以看到下图


这张图可以看出,0地址放的是IROM和IRAM,为什么要有这段地址,实际上是CPU把真正的IROM和IRAM映射到这里,因为系统已启动就在0地址找代码执行,所以一上电就执行了IROM里面的代码,因为硬件它自动把它映射过来了,所以你这个代码是无法放到这个地方来的,这不就有问题了么,我要放到0,你现在又不让我放,那这个问题怎么解决,我们就借助MMU,这种硬件就可以把我们的问题给搞定,怎么解决的,简单讲一下,MMU其实是CPU当中的一个硬件单元,这个硬件单元怎么用的呢,虽然这个MMU在这里,但是用不用是我的事情,如果说我们没有去使用它,你CPU发出你要到内存单元里面去寻找地址,给出的就是物理地址。我们上面的就是物理地址,你在哪实际上就是在哪里。现在把它打开了,你CPU里面发出来的地址就不再是物理地址,而是虚拟地址,怎么办,我最终的虚拟地址还是要去对应你的物理地址,MMU就会根据你CPU发出的虚拟地址去地址转换表(记录着虚拟地址和物理地址的地址转换)去找到物理地址。但是虚拟地址和物理地址直接的转换关系是什么样的呢,下面直接给出转换表

,所以上面的是虚拟地址。然后我们前面在裸机里面操作LED实际上也是操作的虚拟地址,只是它的虚拟地址和物理地址映射的值是一样的,就是上面的0xD0000000-0xFFFFFFFF.

但是内核里面一定会用MMU的,实际上将来如果我们的程序直接去访问物理地址其实是很危险的,真实的数据全部写在那里,如果不加任何限制,不安全。


S5PV210的启动问题:

S5PV210有一个手册,如下

,看里面的第七页,这其实就是开发板的启动流程图。


我们先不管其他的,先看这个图里有几个部分,一个cotex-a8处理器,然后就是我们所谓的SRAM和IROM,SRAM就是你CPU里面有一个静态的RAM,就是SRAM,SRAM上电就能用,所谓上电就能用指的就是一通电我就可以把东西往里面放,就可以存储东西了,DRAM一上电是不可以用的,你需要把它接在控制器初始化等等。IROM里面放的就是三星放好的启动代码,只读的,里面已经放好代码了。然后就是一些控制器,比如NOR FLASH,ESSD,HS-MMC,ONENAND,NAND等等。

一商店就是去0地址上去支持代码,由上面可以知道0地址是IROM和IRAM的代码,那是三星写进去的,源代码没有公开。这段代码会判断你的拨码开关,判断你从哪里启动,假定你在nandflash启动,假设这个里面放了你的启动代码和操作系统,这个BL1和BL2是什么啊,这个BL其实是bootloader,其实就是一个启动程序,一个引导程序,然后这个BL0也就是IROM里面的会先从你的nandflash的0地址处读出BL1放到SRAM里面去,其实这个BL1就是u-boot.bin里面的前面一段代码。你把它读到SRAM里面,这个代码就可以运行了,运行之后干了什么事情呢,它又去把你的BL2读到SRAM里面去,它总共就96K,读到这里来之后你想一想他接下来要干什么,你想一想你BL2这段代码的执行是不是要去初始化你的SDRAM controller,因为你这个SRAM在怎么样也只有96K,担负不起运行操作系统的重任,初始化了SRAM,SRAM就可以用了,SRAM有X个G呢,想怎么用就怎么用。所以第四步写的把OS放到SRAM里面去。这是三星推荐的,但是我们的场景跟这个有一点点区别,我们的场景是,开发板通过拨码开关的设定从nand flash启动,我们的启动程序(u-boot.bin)烧写到了nand flash上面,开发板上电,CPU最新执行IROM里面的启动代码,IROM里面的启动代码,IROM里面的启动代码实际上是被三星固化的,被硬件映射在了0地址处。因为板子上电,默认到0地址上面去找程序执行,IROM里面的代码回去判断你的拨码开关,从那种设备去启动,我们设定了nand flash,所以IROM就会去nand flash的0地址处读取启动代码,就是我们u-boot.bin前面的那段代码,读了8K,最大能读16,文档里面说明了。把它读到CPU里面的IRAM,由于你的IRAM是SRAM,SRAM就是静态RAM,特性决定上电就可以启动。第三部,执行BL1的代码,也就是我们u-boot.bin的前8K代码,注意按照这个图的画法,这个BL1又会把BL2读到IRAM,我们这里就不去读了。因为我们U-BOOT的代码超过了96,你再怎么读也读不完全,怎么办,于是我们直接在BL1里面把SDRAM初始化,把BL2读到SDRAM里面去。所以这个8K最为关键的是初始化硬件,初始化CPU内部的SDRAM控制寄存器,使得开发板外接的1G的外接内存就可以使用,当你SDRAM内存可以使用了,BL1会将剩下的整个u-boot.bin从nand flash读到sdram,然后就跳转到你SDRAM中接着执行u-boot,bin,执行u-boot.bin,如果不敲空格就会加载我们的操作系统到SDRAM。


为什么要把u-boot.bin烧写在nandflash的0地址处,IROM如何知道要读多大的代码到BL1(8K)?

我们还是要去看我们上面说的那个文档的第19页


为什么你uboot.bin要烧写到我们nand flash的0地址呢,这里就可以看出来

至于为什么是8K


在u-boot.bin程序的最开始要有16个字节的头信息,16个字节4个字。第一个字:指定IROM读取BL1代码的大小,8K

第二个:保留    第三个字:累加和校验值(用户写)




原创粉丝点击