下面是一个宏定义,从名字“bad_save_user_regs”就可以猜测它是用来保存程序“出错”时用户态的寄存器的值。

从下面的“use bad_save_user_regs for abort/prefetch/undef/swi ...”
可以知道,这些“错误”是就是发生abort、prefetch、undef、swi异常时。
为什么我把“出错”、“错误”加上引号?因为这些“错误”,有时候是故意加入的,
就是为了触发异常处理程序,从而完成某些事情,比如:系统调用就是通过swi异常实现的。 CODE: .macro bad_save_user_regs //bad_save_user_regs为宏名字
sub sp, sp, #S_FRAME_SIZE // 这个宏既然是用来“保存寄存器”的,那保存在哪呢?自然是保存在“栈”中:先令sp指针自减S_FRAME_SIZE
// 这些被保存的寄存器称为“帧”,它们的总长度是S_FRAME_SIZE stmia sp, {r0 - r12} @ Calling r0-r12
// 这句话就是保存,把r0至r12保存到SP中,stmia sp中的ia表示,sp的值increase after save,
//就是保存一个,就增加4个字节。所以,r0 - r12这13个寄存器就被从下到上保存在刚刚划出的大小为
//S_FRAME_SIZE的这段空间里了
// 要注意的是,这句指令执行完后,sp的值又恢复成原值,就是“sub sp, sp, #S_FRAME_SIZE”后的值
// 这小段代码,都是计算发生“abort stack”的值
ldr r2, _armboot_start // r2等于_armboot_start所指向的值,就是u-boot在内存中存放的开始地址, 就是0x33f80000 sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
//0x33f80000 - (CONFIG_STACKSIZE+CFG_MALLOC_LEN):
//CONFIG_STACKSIZE是正常程序运行时的栈大小,CFG_MALLOC_LEN是堆的大小 sub r2, r2, #(CFG_GBL_DATA_SIZE+) @ set base words into abort stack
// CFG_GBL_DATA_SIZE是一个全局变量的大小,8:两个字,用来存放发生这些异常时的pc、cpsr寄存器 ldmia r2, {r2 - r3} @ get pc, cpsr // 把发生异常时,使用get_bad_stack保存的pc、cpsr寄存器加载到r2,r3
add r0, sp, #S_FRAME_SIZE @ restore sp_SVC // r0=原来的SP值
add r5, sp, #S_SP // 从这句指令看,原来SP之上,也是用来保存寄存器的
// S_SP等于52,表示“原来SP + 52”的地方,是保存sp寄存器
mov r1, lr // r1=lr
stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr
// “原来SP + 52”的地方 存入 r0,即“原来的SP值”,就是sp_SVC,即被中断时的SP值
// “原来SP + 56”的地方 存入 r1,即lr,就是lr_SVC,即被中断时的lr值
// “原来SP + 60”的地方 存入 r2,即pc,就是“使用get_bad_stack保存的pc”,即被中断时的pc值
// “原来SP + 64”的地方 存入 r3,即cpsr,就是“使用get_bad_stack保存的cpsr”,即被中断时的cpsr值
// 52、56、60、64对应S_SP、S_LR、S_PC、S_PSR
mov r0, sp // r0=sp
.endm http://blog.csdn.net/ltt305210390/article/details/9270181

Uboot的bad_save_user_regs的更多相关文章

  1. uboot(二): Uboot-arm-start.s分析

    声明:该贴是通过参考其他人的帖子整理出来,从中我加深了对uboot的理解,我知道对其他人一定也是有很大的帮助,不敢私藏,如果里面的注释有什么错误请给我回复,我再加以修改.有些部分可能还没解释清楚,如果 ...

  2. uboot完全手册---14

    1. u-boot介绍 本次移植采用的是U-Boot-1.2.0版本. 3. U-Boot源码分析 3.1 源码入口的解释 可能大多数的同学上网查资料后都了解到,stage1阶段的启动代码,主要就在s ...

  3. 基于devkit8600的2011.04版uboot启动代码Start.s分析

    /* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...

  4. 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)

    Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash c ...

  5. uboot start.S分析

    一.概述   1.本文综述及特色  阅读uboot,start.S是第一个源程序文件,主要完成初始化看门狗.定时器.重定位(拷贝代码段到内存中).初始化堆栈.跳转到第二阶段等工作. 网上关于这些内容的 ...

  6. uboot中的中断macro宏

    目录 uboot中的中断macro宏 引入 内存分配 流程概览 普通中断 保存现场 中断函数打印具体寄存器 恢复现场 软中断 空间获取 保存现场 附录速记 疑惑待解 title: uboot中的中断m ...

  7. 嵌入式Linux开发之uboot启动Linux整体流程分析

    嵌入式Linux开发之uboot启动Linux整体流程分析 Uboot全称Universal Boot Loader,一个遵循GPL协议的的开源项目,其作用是引导操作系统,支持引导linux.VxWo ...

  8. 六、uboot 代码流程分析---start.S

    6.1 _start 入口函数 6.1.1 vectors.S (arch\arm\lib) 从上一节可以知道,uboot 的入口函数为 _start .此 函数定义在 vectors.S (arch ...

  9. ARM上电启动及Uboot代码分析

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27698707 注意:由于文档是去年 ...

随机推荐

  1. info.plist

    更新了Xcode8 以及 iOS10,App访问用户的相机.相册.麦克风.通讯录的权限都需要重新进行相关的配置,不然在Xcode8中打开编译的话会直接crash. 需要在info.plist中添加Ap ...

  2. UsageLog4j

      迁移时间:2017年5月21日09:42:46CreateTime--2017年1月2日09:35:55Author:Marydon原文链接:http://www.360doc.com/conte ...

  3. DIY手机万能红外遥控器

    DIY手机万能红外遥控器 1.手机安装软件:遥控精灵 2.红外二极管两个(旧的遥控器里面可以拆) 3.耳机的插头一个 步骤:首选讲两个二极管的正负相接(即a二极管的正极连接b二极管的负极,a二极管的负 ...

  4. LEGO机器人发展史

    1998,cybermaster 1999,RCX 1999,micro scout 2000,scout 2002,spybotics NXT NXT2 EV3

  5. cocos2d-x 旅程開始--(实现单击与长按)

    小菜鸟一枚,学习cocos2d-x已经有一段时间了,感觉进度非常慢那,CSDN也再次拾了起来.近期自己还在学习做小游戏,跟着前辈做了<忍者打怪物>的小游戏,又学习了瓦片游戏<吃西瓜& ...

  6. 【laravel5.4】使用baum\node 类库实现无限极分类

    1.在model中引入baum\node 类库,并继承,具体参考 https://packagist.org/packages/baum/baum 2.核心代码: /* * model::create ...

  7. iOS同一项目多个Target的快速实现方法 - 两种使用场景详解

    我们项目中,默认建好是只有一个target的,但是,一些场景中,多target能帮助我们更好的使用项目. 场景1: 同一项目,一般会分不同环境:开发环境.测试环境.正式(生产)环境. 这就涉及到一个请 ...

  8. C#抽象方法

    在覆盖父类的方法时,必须显式说明是在覆盖父类方法,否则相当于没有覆盖. class Animal { public void run() { Console.WriteLine("anima ...

  9. 安卓请求网络错误 直接在main Thread 进行网络操作出现maintreamexception

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites ...

  10. RMAN性能监控

    RMAN性能调优相关视图 视图名 说明 v$rman_backup_job_details 备份job信息 v$backup_async_io 当前正在运行的.最近完成的备份和restore操作的rm ...