0

我编写了这个 arm 汇编代码调用 pthread 来实现多线程功能。我写了两个类似的文件,但是这个很棘手。

主要功能是:

main:
stmfd           sp!, {fp,lr}

add             fp, sp, #4
sub             sp, sp, #8

sub             r3, sp, #8
mov             r0, r3
mov             r1, #0
ldr             r2, .l_thrd1
mov             r3, #0
bl              pthread_create

ldr r3, [fp, #-8]
mov r0, r3
mov r1, #0
bl pthread_join
...

使用objdump查看相关反汇编代码:

00405468 <pthread_join>:
  405468:       e5903068        ldr     r3, [r0, #104]  ; 0x68
  40546c:       e92d45f0        push    {r4, r5, r6, r7, r8, sl, lr}
  405470:       e3530000        cmp     r3, #0
  405474:       e24dd014        sub     sp, sp, #20
  405478:       e1a05000        mov     r5, r0
  40547c:       e1a06001        mov     r6, r1
  405480:       ba00004a        blt     4055b0 <pthread_join+0x148>
  405484:       e590321c        ldr     r3, [r0, #540]  ; 0x21c
  ....

它看起来很正常,除非它导致了段错误。qemu.log 看起来凌乱而蹩脚:

----------------
IN: pthread_join
INST: isa=[0] opk=[JMP_OP] src={-,-,-,-} dst={-,-} shift={-,-,-} c=[1] s=[-] imm=[24,74] rotate_reg=[-] vfp={-,-,-,-} vfp_val={-,-,-,-} ### 
0x00405468:  e5903068      ### ldr  r3, [r0, #104]
0x0040546c:  e92d45f0      ### push     {r4, r5, r6, r7, r8, sl, lr}
0x00405470:  e3530000      ### cmp      r3, #0  ; 0x0
0x00405474:  e24dd014      ### sub      sp, sp, #20     ; 0x14
0x00405478:  e1a05000      ### mov      r5, r0
0x0040547c:  e1a06001      ### mov      r6, r1
0x00405480:  ba00004a      ### b.lt     0x4055b0

----------------
IN: pthread_join
INST: isa=[0] opk=[JMP_OP] src={-,-,-,-} dst={-,-} shift={-,-,-} c=[1] s=[-] imm=[24,74] rotate_reg=[-] vfp={-,-,-,-} vfp_val={-,-,-,-} ### 
0x00405468:  e5903068      ### ldr  r3, [r0, #104]
0x0040546c:  e92d45f0      ### push----------------
IN: start_thread
INST: isa=[0] opk=[JMP_OP] src={-,-,-,-} dst={-,-} shift={-,-,-} c=[0] s=[-] imm=[24,4148] rotate_reg=[-] vfp={-,-,-,-} vfp_val={-,-,-,-} ### 
0x00404274:  e7802003      ###    str{r4, r5      , r6, r7r2, ,r8,  sl[r0, , lrr3}]
0x00405470:  e3530000      ###
....

显然,pthread_join 已经输入了两次。而在第二次,“推送”指令似乎还没有完全执行。寄存器看起来也很正常。我就是不明白。

另一个代码以正确的顺序运行。他们几乎相同的编码。

4

1 回答 1

0

没有人得到这个问题的答案。我得自己回答。

该问题是由于堆栈指针 (r13) 无意中保存在内存中并被另一个线程更改而引起的。所以 r13 指向了另一个内存地址,导致了段错误。

于 2013-09-18T16:06:37.553 回答