Uboot中Start.S 开始的第一句b reset 做了哪些事情

#include <asm-offsets.h>
#include <config.h>
#include <version.h>
#include <asm/system.h>
#include <linux/linkage.h>

.globl _start

_start: b reset
---------------

    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
reset标号的内容:
reset:
    bl  save_boot_params
    /*
     * set the cpu to SVC32 mode
     */
    mrs r0, cpsr              //读CPSR寄存器
    bic r0, r0, #0x1f         //清0
    orr r0, r0, #0xd3         //设置SVC模式+关中断
    msr cpsr,r0               //写回CPSR寄存器

save_boot_params标号内容:
    ENTRY(save_boot_params)
    bx  lr          @ back to my caller
    ENDPROC(save_boot_params)
    .weak   save_boot_params

ENTRY(save_boot_params)和ENDPROC(save_boot_params)这两个宏在更目录下的include/linux/linkage.h中何可查找到,该处代码全部展开:

.globl save_boot_params
.align 4                        //4字节对齐
save_boot_params:
bx lr                            //带模式的返回

.type save_boot_params STT_FUNC;    //说明该标识是函数
.size save_boot_params,.-save_boot_params   //计算整个函数的大小


.weak   save_boot_params   //弱标号,如果别处有使用别处的定义,如果没有使用当前定义

为何选择SVC模式

ARM的CPU的7种模式:

用户模式(usr)
正常程序工作模式 此模式下程序不能够访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式的切换。
系统模式(sys)
用于支持操作系统的特权任务等 与用户模式类似,但具有可以直接切换到其它模式等特权
快中断模式(fiq)
支持高速数据传输及通道处理 FIQ异常响应时进入此模式
中断模式(irq)
用于通用中断处理 IRQ异常响应时进入此模式
管理模式(svc)
操作系统保护代码 系统复位和软件中断响应时进入此模式
中止模式(abt)
用于支持虚拟内存和/或存储器保护 在ARM7TDMI没有大用处
未定义模式(und)
支持硬件协处理器的软件仿真 未定义指令异常响应时进入此模式

7种模式中,除用户usr模式外,其它模式均为特权模式。

中止abt和未定义und模式
首先可以排除的是,中止abt和未定义und模式,异常处理模式,此处程序是正常运行的,所以不应该设置CPU为其中任何一种模式,所以可以排除。

快中断fiq和中断irq模式
其次,对于快中断fiq和中断irq来说,此处uboot初始化的时候,中断已经被禁用,而且即使是注册了终端服务程序后,能够处理中断,那么这两种模式,也是自动切换过去的,所以,此处也不应该设置为其中任何一种模式。

用户usr模式
虽然从理论上来说,可以设置CPU为用户usr模式,但是由于此模式无法直接访问很多的硬件资源,而uboot初始化,就必须要去访问这类资源,所以此处可以排除,不能设置为用户usr模式。

系统sys模式 vs 管理svc模式
sys模式和usr模式相比,所用的寄存器组,都是一样的,但是增加了一些访问一些在usr模式下不能访问的资源。

svc模式本身就属于特权模式,本身就可以访问那些受控资源,而且,比sys模式还多了些自己模式下的影子寄存器,所以,相对sys模式来说,可以访问资源的能力相同,但是拥有更多的硬件资源。

所以,从理论上来说,虽然可以设置为sys和svc模式的任一种,但是从uboot方面考虑,其要做的事情是初始化系统相关硬件资源,需要获取尽量多的权限,以方便操作硬件,初始化硬件。

从uboot的目的是初始化硬件的角度来说,设置为svc模式,更有利于其工作。
因此,此处将CPU设置为SVC模式。

uboot作为一个bootloader来说,最终目的是为了启动Linux的kernel,在做好准备工作(即初始化硬件,准备好kernel和rootfs等)跳转到kernel之前,本身就要满足一些条件,其中一个条件,就是要求CPU处于SVC模式的。
所以,uboot在最初的初始化阶段,就将CPU设置为SVC模式,也是最合适的。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值