Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29165
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-30 13:29
文章分类

全部博文(9)

文章存档

2017年(9)

我的朋友

分类: LINUX

2017-08-12 10:20:31

由于steppingstone因素,保存在nand flash的执行指令的前4k会搬到SRAM上执行。此时CPU是从SRAM取指令执行。
但是由于整个执行指令的代码会大于4k,因此前4k执行指令的部分功能是把所有代码搬到内存中,再由CPU从内存中读取指令。

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:

  4.     bl disable_watch_dog
  5.     bl memsetup
  6.     bl copy_to_sdram
  7.     ldr pc, =on_sdram
  8.     
  9. on_sdram:
  10.     ldr sp, =0x34000000
  11.     bl main
  12.     
  13. halt_loop:
  14.     b halt_loop
第9行就是跳转取指令的地方。由从SRAM取指令转为从内存取指令。

点击(此处)折叠或打开

  1. sdram_elf: file format elf32-littlearm

  2. Disassembly of section .text:

  3. 30000000 <_start>:
  4. 30000000:    eb000005     bl    3000001c <disable_watch_dog>
  5. 30000004:    eb000008     bl    3000002c <memsetup>
  6. 30000008:    eb000010     bl    30000050 <copy_to_sdram>
  7. 3000000c:    e59ff090     ldr    pc, [pc, #144]    ; 300000a4 <mem_cfg_val+0x34>

  8. 30000010 <on_sdram>:
  9. 30000010:    e3a0d30d     mov    sp, #872415232    ; 0x34000000
  10. 30000014:    eb000032     bl    300000e4 <main>

  11. 30000018 <halt_loop>:
  12. 30000018:    eafffffe     b    30000018 <halt_loop>

  13. 3000001c <disable_watch_dog>:
  14. 3000001c:    e3a01453     mov    r1, #1392508928    ; 0x53000000
  15. 30000020:    e3a02000     mov    r2, #0    ; 0x0
  16. 30000024:    e5812000     str    r2, [r1]
  17. 30000028:    e1a0f00e     mov    pc, lr

  18. 3000002c <memsetup>:
  19. 3000002c:    e3a01312     mov    r1, #1207959552    ; 0x48000000
  20. 30000030:    e28f2038     add    r2, pc, #56    ; 0x38
  21. 30000034:    e1a00000     nop            (mov r0,r0)
  22. 30000038:    e2813034     add    r3, r1, #52    ; 0x34
  23. 3000003c:    e4924004     ldr    r4, [r2], #4
  24. 30000040:    e4814004     str    r4, [r1], #4
  25. 30000044:    e1510003     cmp    r1, r3
  26. 30000048:    1afffffb     bne    3000003c <memsetup+0x10>
  27. 3000004c:    e1a0f00e     mov    pc, lr

  28. 30000050 <copy_to_sdram>:
  29. 30000050:    e3a01000     mov    r1, #0    ; 0x0
  30. 30000054:    e3a02203     mov    r2, #805306368    ; 0x30000000
  31. 30000058:    e3a03a01     mov    r3, #4096    ; 0x1000
  32. 3000005c:    e4914004     ldr    r4, [r1], #4
  33. 30000060:    e4824004     str    r4, [r2], #4
  34. 30000064:    e1510003     cmp    r1, r3
  35. 30000068:    1afffffb     bne    3000005c <copy_to_sdram+0xc>
  36. 3000006c:    e1a0f00e     mov    pc, lr

  37. 30000070 <mem_cfg_val>:
  38. 30000070:    22011110     andcs    r1, r1, #4    ; 0x4
  39. 30000074:    00000700     andeq    r0, r0, r0, lsl #14
  40. 30000078:    00000700     andeq    r0, r0, r0, lsl #14
  41. 3000007c:    00000700     andeq    r0, r0, r0, lsl #14
  42. 30000080:    00000700     andeq    r0, r0, r0, lsl #14
  43. 30000084:    00000700     andeq    r0, r0, r0, lsl #14
  44. 30000088:    00000700     andeq    r0, r0, r0, lsl #14
  45. 3000008c:    00018005     andeq    r8, r1, r5
  46. 30000090:    00018005     andeq    r8, r1, r5
  47. 30000094:    008c07a3     addeq    r0, ip, r3, lsr #15
  48. 30000098:    000000b1     streqh    r0, [r0], -r1
  49. 3000009c:    00000030     andeq    r0, r0, r0, lsr r0
  50. 300000a0:    00000030     andeq    r0, r0, r0, lsr r0
  51. 300000a4:    30000010     andcc    r0, r0, r0, lsl r0
  52. 300000a8:    e1a00000     nop            (mov r0,r0)
  53. 300000ac:    e1a00000     nop            (mov r0,r0)
第9行ldr pc, =on_sdram 对应的反汇编是:
3000000c: e59ff090 ldr pc, [pc, #144] ; 300000a4
最左边是链接地址,pc=3000000c+8,[pc, #144]=[3000000c+4+144]=[300000a4],取300000a4地址的值复制给PC
300000a4: 30000010 andcc r0, r0, r0, lsl r0
PC=[300000a4]=30000010,就是标记on_sdram开始的地址
注意:链接地址从30000000是有在链接时候决定的:
arm-linux-ld -Ttext 0x30000000 sdram.o leds.o -o sdram_elf
阅读(1721) | 评论(0) | 转发(0) |
0

上一篇:Linux中与内核通信的Netlink机制(实例)

下一篇:没有了

给主人留下些什么吧!~~