Uboot的bad_save_user_regs
下面是一个宏定义,从名字“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的更多相关文章
- uboot(二): Uboot-arm-start.s分析
声明:该贴是通过参考其他人的帖子整理出来,从中我加深了对uboot的理解,我知道对其他人一定也是有很大的帮助,不敢私藏,如果里面的注释有什么错误请给我回复,我再加以修改.有些部分可能还没解释清楚,如果 ...
- uboot完全手册---14
1. u-boot介绍 本次移植采用的是U-Boot-1.2.0版本. 3. U-Boot源码分析 3.1 源码入口的解释 可能大多数的同学上网查资料后都了解到,stage1阶段的启动代码,主要就在s ...
- 基于devkit8600的2011.04版uboot启动代码Start.s分析
/* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...
- 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)
Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM: 128 MiBCheck spi flash c ...
- uboot start.S分析
一.概述 1.本文综述及特色 阅读uboot,start.S是第一个源程序文件,主要完成初始化看门狗.定时器.重定位(拷贝代码段到内存中).初始化堆栈.跳转到第二阶段等工作. 网上关于这些内容的 ...
- uboot中的中断macro宏
目录 uboot中的中断macro宏 引入 内存分配 流程概览 普通中断 保存现场 中断函数打印具体寄存器 恢复现场 软中断 空间获取 保存现场 附录速记 疑惑待解 title: uboot中的中断m ...
- 嵌入式Linux开发之uboot启动Linux整体流程分析
嵌入式Linux开发之uboot启动Linux整体流程分析 Uboot全称Universal Boot Loader,一个遵循GPL协议的的开源项目,其作用是引导操作系统,支持引导linux.VxWo ...
- 六、uboot 代码流程分析---start.S
6.1 _start 入口函数 6.1.1 vectors.S (arch\arm\lib) 从上一节可以知道,uboot 的入口函数为 _start .此 函数定义在 vectors.S (arch ...
- ARM上电启动及Uboot代码分析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27698707 注意:由于文档是去年 ...
随机推荐
- Java中的软(弱)引用
一.Java中的强.软.弱.虚引用 在JDK中我们能够看到有一个java.lang.ref的包.这个包中就是Java中实现强.软.弱.虚引用的包,例如以下: PhantomReference 虚引用: ...
- 关于html中的doctype的重要性的认知以及IE的浏览器模式与文档模式
浏览器模式”用于切换IE针对该网页的默认文档模式.对不同版本浏览器的条件备注解析.发送给网站服务器的用户代理(User-Agent)字符串的值.网站可以根据浏览器返回的不同用户代理字符串判断浏览器的版 ...
- JUC-Callable
实现线程的方式有四种: 1,实现runnable接口: 2,继承Thread. 3,也就是本节的Callable接口. 4,使用线程池. 区别: 实现Callable接口的方式,相较于实现Runnab ...
- flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事项
一. fluem中出现,transactionCapacity查询一下,得出一下这些: 最近在做flume的实时日志收集,用flume默认的配置后,发现不是完全实时的,于是看了一下,原来是memery ...
- C#基础蛋疼到爆的Byte类型表数范围之网兜毛衣见解……
事实上写这篇对Byte类型表数范围的文章,真的是蛋疼+蛋疼+蛋疼,每每看到Byte表数范围这一块.都对-128如此的陌生与迷茫.操蛋的Byte,操蛋的人生-- 熊孩子出场:Byte 恶作剧结果:表数范 ...
- Android API之java.lang.String
boolean java.lang.String.contains(CharSequence cs) String字符串是否包含CharSequence(cs).
- HDUOJ---3743Frosh Week(BIT+离散化)
Frosh Week Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
1.SqlHelper.java import java.lang.reflect.*; import java.sql.*; import java.util.*; public class Sql ...
- python练习笔记——用函数对列表奇偶分类,且过程不增加新列表
编写一个函数:函数接收一个列表,将列表中所有的奇数,放到偶数之前,要求过程中不增加新的列表 def fun(*args): # 因为奇数放在偶数之前,标记出奇数中的偶数 # 并将该偶数取出放在数列的最 ...
- Android: ListView数据的分批加载 以及 Handle 总结
这是效果图: activity_main.xml 01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...