210_loader_nandboot启动执行过程

一、Linux内核启动过程:

boot loader  == bios
1.启动boot:
启动是为了能在系统上加载并执行内核做准备。主要完成以下工作:
a.关中断、关看门狗
b.初始化CPU的工作时钟频率
c.初始化UART设备,用它来做终端设备
d.内存DDR2 SDRAM的初始化
e.NAND Flash设备的初始化

2.加载loader:
加载Linux操作系统的内核,再由内核完成操作系统的初始化。加载完操作系统并让内核开始执行,这以后是内核在接手系统的控制,bootloader程序就不再起作用了。

PC机的启动过程:
电脑加电后,CPU会完成自身的硬件初始化,并且做自测试(上电自举),CPU到一个预先定好的地址去取指令执行(这里是BIOS芯片的地址),在BIOS里设置有启动设备的信息,找到第一个启动设备,如果这是一个硬盘,之后会到它的MBR(主引导扇区)里取指令执行,然后它再找到硬盘的第一个活动分区(对windows来说一般是C盘,linux则是根目录的那个分区),从活动分区中找到启动加载程序(bootloader),这个程序在Linux上通常是LILO或者GRUB,GRUB程序执行以后回去找到硬盘上的LINUX内核并加载它,内核开始执行以后会初始化计算机上的其他的硬件设备,最后会挂载根文件系统,初始化用户程序运行环境(执行自启动脚本,或者开启一些服务程序),最后给用户一个登录界面,输入用户名和密码成功后,LINUX启动就完成了。

开发板的启动过程:
开发板上电,CPU硬件初始化,它一般先到0地址去取指令执行,tiny210板子的0地址对应的设备,是在S5PV210芯片内部的iRom的设备(里面是三星公司在CPU出厂前预先固化的一些程序) ,iRom中的程序主要完成以下工作:
a.初始化CPU时钟频率到默认的800MHz
b.初始化CPU内部的iRAM
c.根据启动拨码开关,找到第一个启动设备(NAND或者SD卡)
d.从第一个启动设备上加载头16K到iRAM中自动执行。
所以我们烧写到开发板上的程序的头16k会自动得到执行,这意味着:
<1>如果你的程序小于16K,你都不需要初始化SDRAM就可以执行你的程序。
<2>如果你的程序大于16K,你的程序只有一部分会得到执行,所以要调整你的链接脚本,把需要预先初始化好的设备的驱动链接到你的程序的头16K里(内存的初始化代码、nand的初始化代码),然后用它先把内存和nand初始化,再做自搬移(把程序自身从nand上搬运到内存上),然后在执行自身在内存上的这个拷贝。
使用上述方法让iRom帮我们执行程序,不论程序有多长。
后续的启动步骤与PC机类似。


二、我们自己的bootloader程序执行过程:
开发板上电,CPU从0地址取指令执行(iROM中的三星预先固化的程序先执行)==>iROM中的程序找到启动设备(SD/NAND)上的头16k,把它复制到iRAM上去执行==>iRAM中的头16k程序的第一条指令就是_start标号处的指令==>在链接脚本中设定了,入口是_start,所以第一条执行应从_start开始执行。
_start ==> 设置SVC模式的栈指针,为后续执行C函数做准备 ==> 关看门狗、关中断 ==> 初始化CPU时钟 ==> 初始化SDRAM内存 ==> 把栈指针指定到一个更宽裕的地方SDRAM ==> bl copy_myself 跳转到copymyself.c文件中的copy_myself函数做自拷贝,把程序自身从nand的0地址搬运到SDRAM内存上0x30000000的位置上, 暂时还未执行(后面再执行) ==>  ldr pc, =loader 跳转到main.c文件中的loader函数执行(loader函数就是我们刚才搬移到SDRAM中的代码) => loader函数中由mode_select()函数选择执行的模式(按下K1按键进入shell模式my_shell(),不按则正常加载内核load_os()) ==> 如果未按下K1,执行了load_os() ==> bootm() (在my_command.c文件中) ==> 在bootm中声明了一个带3个参数的函数指针 void (*fp)(int,int,int),第一个参数固定为0,第二个参数是开发板板号3466,第三个参数是内核启动参数(就是Uboot中的bootargs环境变量的值,它应该放在内存地址0x20000100位置上,以taglist一个链表的形式存在)==> fp()函数一旦启动了内核的执行,bootloader程序就不存在了。以后就是由linux内核在管理我们的计算机系统了。

烧写方法:
loadb 加载到0x21000000内存地址上,加载文件send app-sd.bin
nand erase 0x0 0x6000
nand write 0x21000000 0x0 0x6000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值