uboot第1阶段执行过程

根据我的经验,芯片公司必问这个:

1. s3c2440根据PIN脚电平知道是nand flash还是norflash启动,假定为nandflash启动,norflash启动更简单,在此不做分析
2. 2440根据PIN脚知道外接的nand flash的指标参数,包括页大小,块大小等
3. 读取nand flash的前4K字节到片内的RAM中,并开始从第一条指令执行,此时虽然nand flash控制器没有设置,但芯片知道如何读取,因为上一步已经检测到flash的配置了,这一步是ARM自动执行的,对程序员透明。
4. 进入管理模式,关中断,关看门狗,设置FCLK:HCLK:PCLK时钟
5. 清空数据/指令cache,关闭MMU,设置内存控制器
6. 设置nand flash控制器,并将其内的自身代码复制到TEXT_BASE位置,该位置在配置文件中指定,是SDRAM的地址空间
7. 校验读取的uboot,比较前4K的内容是否相等,不等说明有错误。地址0在片内,与地址TEXT_BASE的内容比较
8. 设置堆栈,清空BSS段,跳到start_armboot处执行。start_armboot地址在编译时决定。跳转前在芯片内RAM中执行,跳转后在外部SDRAM中执行,因为跳转的地址在SDRAM地址范围内

至此开始了C语言的设置阶段。

u-boot中几个主要文件及作用

‍U-Boot的启动代码分布在start.S、low_level_init.S、board.c和main.c文件中。其中,start.S是U-Boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;level_init.S是特定开发板的设置代码;board.c包含开发板底层设备驱动;main.c是一个与平台无关的代码,U-Boot应用程序的入口在此文件中。

第一阶段(stage 1)是依赖于CPU体系结构的代码(如设备初始化代码等),一般用汇编语言来实现。主要进行以下方面的设置:设置ARM进入SVC模式、禁止IRQ和FIQ、关闭看门狗、屏蔽所有中断。协处理器清空I/D cache、清空TLB、禁止MMU和cache、配置内存控制器(BWS)、设置堆栈,设置时钟(FCLK,HCLK,PCLK)、为搬运代码做准备、搬移uboot映像到RAM中(C语言使用CopyCode2Ram ,或者使用copy_loop实现)、分配堆栈、清空bss段(使用clbss_l实现)。

第二阶段(stage 2)通常用C语言来实现。
start_armboot(): 
     一系列初始化(cpu, 板卡,中断,串口,控制台等),开启I/D cache。初始化FLASH,根据系统配置执行其他初始化操作。打印LOG,使能中断,获取环境变量,初始化网卡。最后进入main_loop()函数。在main_loop函数中会检查bootdelay和bootcmd环境变量,如果bootcmd已经设置过,则在等待bootdelay个毫秒后会自动执行bootcmd。如果等待过程中被用户中断(ctl+c)或者bootcmd没有设置,则会等待用户输入命令。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值