为什么这条pop指令不恢复寄存器值?

问题描述 投票:0回答:1

我正在研究在 stm32f103rb 中实现的 操作系统。我到达02-ContextSwitch-1章节,发现程序崩溃并抛出此错误。

qemu:致命:尝试在 RAM 或 ROM 之外的 0x681b4b14 处执行代码

R00=00000003 R01=00000000 R02=4000440c R03=00000000

R04=2000a000 R05=08000129 R06=08000191 R07=08000197

R08=af00b480 R09=681b4b17 R10=f0434a16 R11=60130305

R12=01000000 R13=00000024 R14=681b4b15 R15=681b4b14

PSR=00000173 ---- T svc32

FPSCR:00000000

make: *** [Makefile:22: qemu] 中止(核心转储)

经过一番调试,发现问题出在activate函数上。

.thumb .syntax unified .global activate activate: /* save kernel state */ mrs ip, psr push {r4, r5, r6, r7, r8, r9, r10, r11, ip, lr} /* switch to process stack */ msr psp, r0 mov r0, #3 msr control, r0 /* load user state */ pop {r4, r5, r6, r7, r8, r9, r10, r11, lr} /* jump to user task */ bx lr
在函数的开头,这些是寄存器值

r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20009bd0 0x20009bd0 lr 0x800011f 134218015
函数结束时,执行

pop

后,寄存器值不会恢复。

r4 0x2000a000 536911872 r5 0x8000129 134218025 r6 0x8000191 134218129 r7 0x8000197 134218135 r8 0xaf00b480 -1358908288 r9 0x681b4b17 1746619159 r10 0xf0434a16 -264025578 r11 0x60130305 1611858693 r12 0x1000000 16777216 sp 0x24 0x24 lr 0x681b4b15 1746619157
这会导致跳转到地址 0x681b4b15 以及相应的错误。

为什么会发生这种事?

编辑:寄存器 R0-R3 似乎没有损坏。

一开始。

r0 0x0 0 r1 0x0 0 r2 0x4000440c 1073759244 r3 0x0 0
最后。

r0 0x3 3 r1 0x0 0 r2 0x4000440c 1073759244 r3 0x0 0
    
assembly operating-system arm cpu-registers context-switch
1个回答
0
投票
问题是 qemu 中的

stm32-p103 只有 20K 内存,而不是链接器脚本期望的 40K 。因此,堆栈恰好被放置在不存在的内存中。将链接描述文件更改为:

RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
    
© www.soinside.com 2019 - 2024. All rights reserved.