2013-06-19 3 views
0

Я написал этот ассемблерный код, вызывающий pthread для реализации многопоточных функций. Я написал два похожих файла, но это довольно сложно.Почему qemu-arm работает pthread_join несколько раз в этом коде ассемблера?

Основная функция:

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 был введен дважды. И во второй раз команда «push», похоже, не была полностью выполнена. Регистры также кажутся нормальными. Я просто не понимаю этого.

Другой код работает в правильном порядке. Они почти такие же закодированы.

ответ

0

Никто не получил ответа на вопрос. Я должен сам ответить.

Проблема была вызвана тем, что указатель стека (r13) был непреднамеренно сохранен в памяти и изменен другим потоком. Поэтому r13 указал на другой адрес памяти и вызвал ошибку сегмента.