2011-03-01 23:25:22

目地:更清晰的了解bootloader的结构及功能。为移植U-boot打基础。

以前只知道大概,今天利用IAR调试工具,看着汇编代码,看着寄存器,看着内存。来单步调试bootloader。把之前不明白的地方都搞明白。

今天单步走到了初始化堆栈。主要研究了设置memory寄存器及初始化堆栈。不过还有一个问题,为什么要用DCD分配内存空间。不能用为WATCHDOG寄存器赋值的方法来给BWSCON来赋值?貌似和内存映像相关。明天要搞明白。

一:设置memory寄存器 (见上图)

二:初始化堆栈

InitStacks
 ;Don't use DRAM,such as stmfd,ldmfd......
 ;SVCstack is initialized before
 ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr
cpsr_cxsf,r1'
 mrs r0,cpsr
 bic r0,r0,#MODEMASK
 orr r1,r0,#UNDEFMODE|NOINT
 msr cpsr_cxsf,r1  ;UndefMode
 ldr sp,=UndefStack  ; UndefStack=0x33FF_5C00

orr r1,r0,#ABORTMODE|NOINT
 msr cpsr_cxsf,r1  ;AbortMode
 ldr sp,=AbortStack  ; AbortStack=0x33FF_6000

。。。。。

bic r0,r0,#MODEMASK|NOINT
 orr r1,r0,#SVCMODE
 msr cpsr_cxsf,r1  ;SVCMode
 ldr sp,=SVCStack  ; SVCStack=0x33FF_5800

这段代码我当初的理解是为修改cpsr的值,然后把各种模式的堆栈值存入sp。运行到最后那么就只为SVCStack赋值了。现在看来这真是天大的笑话。根据下图可知:不同模式有自己单独的sp(即R13寄存器)常作为栈指针。上面代码就是先设置模式,然后再在此模式下,初始化R13寄存器。

每一种异常模式都有自己担任R12,应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出,这样就使异常处理程序不会破坏被其中断程序的运行现场。

裸奔的bootloader单步调试的更多相关文章

  1. S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的

    S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...

  2. GDB 单步调试汇编

    本文同时发表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/134 之前在看汇编的时候一直是肉眼看GCC -S的结果,缺点是 ...

  3. GDB:从单线程调试到多线程调试(MFiX单步调试)

    GDB:从单线程调试到多线程调试 1. 裸跑GDB 1.1 安装GDB sudo apt-get install gdb 1.2 编译程序 由于需要调试,因此编译的时候需要添加-g编译参数: 1.3 ...

  4. (转)裸奔的后果!一次ssh被篡改的入侵事件

    裸奔的后果!一次ssh被篡改的入侵事件 原文:http://blog.51cto.com/phenixikki/1546669 通常服务器安全问题在规模较小的公司常常被忽略,没有负责安全的专员,尤其是 ...

  5. Hawk 4.7 单步调试

    单步调试的意义 已经编写的工作流,可能会因为某些外界环境的变化而出错,此时需要排除错误,我们可以使用单步调试. 单步调试的本质,相当于只使用前n个模块,这样就能看到每个步骤下,流的改变. 例子 还是上 ...

  6. 关于 MonoDevelop on Linux 单步调试问题的解决

    在 MonoDevelop 中默认是关闭对外部程序集(.dll)的调试,可通过如下步骤来解决这个问题. 通过菜单[Edit]-[Preferences]-[Debugger]进入到调试器的设置页,把“ ...

  7. jeecg单步调试

    自己没本事写开发平台,用别人的又各种担心,想学着别人弄个单步调试,老是出现这个"source not found"-- 百度各种方法都搞不定,担心是自己安装错了?这个jeecg本身 ...

  8. Android Studio中JNI程序的单步调试和日志打印

    近日有个算法(检测碰撞)需要用C++实现,目的是IOS和ANDROID中共享同一段程序. 下面说说android调用这段程序过程中遇到的一些事情.(过程中网上搜索了一些相关文章,大部分说的是eclip ...

  9. idea导入maven项目,web browser远程单步调试

    问题:之前用idea14.1.3导入maven项目后,maven的dependencies不能自动解决依赖,到处都是红色的红线,看着就受不了.虽然不影响命令行编译,但是看着实在是不爽.总结下面几小步: ...

随机推荐

  1. JNDI数据源的配置

    一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Conn ...

  2. jstat命令详解

    Jstat是JDK自带的一个轻量级小工具.全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令 ...

  3. Android Studio 3依赖配置

    新配置 对应的过时配置 描述 implementation compile module编译时可用,module的使用者运行时可用,对于大量使用library的项目,可以显著提高编译时间,因为它可以减 ...

  4. 133、 Android 自动化测试(转载)

    Android 自动化测试--要点概括http://blog.csdn.net/vshuang/article/details/40595233 A/B测试与灰度发布http://blog.csdn. ...

  5. 关于vb编程之字符串连接/拼接的方法与技巧

    在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连 ...

  6. 启动Mysql数据库报错误:-bash: ./start.sh: Permission denied

    linux下安装好Mysql数据库后,输入启动命令: cd /home/homework/mysql && ./start.sh 回车后报如下错误: 原因是:该文件未有相关执行权限 解 ...

  7. M - COURSES

    Consider a group of N students and P courses. Each student visits zero, one or more than one courses ...

  8. linux 压缩和解压

    xz 压缩和解压 tar -Jcvf backup.tar.xz backup/ tar -Jxvf backup.tar.xz 加参数 p,使文件保持原来的权限. tar -Jcvpf timesh ...

  9. 解决ssh出现"Write failed: Broken pipe"问题

    用 ssh 命令连接服务器之后,如果一段时间不操作,再次进入 Terminal 时会有一段时间没有响应,然后就出现错误提示: Write failed: Broken pipe 只能重新用 ssh 命 ...

  10. GetAsyncKeyState()& 0x8000

    0x8000 & GetKeyState(VK_SHIFT); 这句是判断是否有按下shift键. 关于GetAsyncKeyState与GetKeyState区别:关于GetAsyncKey ...