最简BootLoader

BootLoader就是一小段程序,他在系统上电时执行,初始化硬件设备,准备好软件环境,最后调用操作系统。这是最简BootLoader的最简定义。

我们C语言中有一个函数指针,它的应用场景,是引用不在代码段的函数。这样就可以理解,因为内核也是一个可执行程序,当我们调到它的入口地址去执行它就可以。

我们写BootLoader的目的就是启动内核,那么内核在哪里了,内核就在nandflash上面,因为重定位的原因,就是2440内部的SRAM为4k,因为nandflash的特点,我们需要将nandflash里面从0地址copy到SRAM,因为SRAM只有4k,所以我们要将其copy到SDRAM去。但是我们在SDRAM中调到内核的地址就可以了吗???不行,因为启动内核时还要传递给内核一些tag信息,两个必须条件是内存标记和命令行参数,启动内核时,我们还会传递一个机器ID,我们传进去的ID和内核支持的ID不相同的话,就无法启动内核。

 

我们烧写的内核是uImage,这个和zImage的区别是,uImage包含了一个64字节头部,头部里面包含了编译时间和内核版本、加载地址、链接地址。

  标记 tag 的地址,2440 常用的做法是放在 0x30000100 处,我们同样也放在这里。其实放那都行,地址会作为参数传递给内核的。tag的放置方法,可以参考 uboot ,必须以 ATAG_CORE 类型的开头,以 ATAG_NONE 类型的结尾。

启动内核时传递给内核的参数,3个,第一个默认0,第三个是前边提到的 tag 的地址,第二个是机器ID。内核中所有支持的“机器”或者称作开发板、单板都用一个 MACHINE_START 宏来定义。

还有一点,我们还要自己写串口程序,因为内核启动的时候,不会初始化串口,所以要打印一些信息,所以还要自己写一个串口。

 

这个里面还有nor和nand,nor比较简单,就是一对一copy,就是dest[]=src[],源等于目的。而nand就要初始化。

 

总结:
1. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
2. 如果bootloader比较大,要把它重定位到SDRAM
3. 把内核从NAND FLASH读到SDRAM
4. 设置"要传给内核的参数"
5. 跳转执行内核

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值