Пошаговые инструкции по пошаговому выполнению кода и сброс содержимого памяти в GDB - PullRequest
1 голос
/ 10 февраля 2020

Я использую gdb для проверки процесса загрузки xv6. В частности, я использую xv6, используя qemu с поддержкой gdb в терминале. А в другом терминале я запускаю gdb, удаленно подключенный к заглушке qemu.

Теперь, пошаговое выполнение процесса загрузки с помощью команды si дает следующие инструкции

[f000:e05b]    0xfe05b: cmpw   $0xffc8,%cs:(%esi)
[f000:e062]    0xfe062: jne    0xd241d416
[f000:e066]    0xfe066: xor    %edx,%edx
[f000:e068]    0xfe068: mov    %edx,%ss
[f000:e06a]    0xfe06a: mov    $0x7000,%sp
[f000:e070]    0xfe070: mov    $0x2d4e,%dx
[f000:e076]    0xfe076: jmp    0x5575ff02

Принимая во внимание, что выгрузка инструкций из памяти непосредственно с помощью команды (gdb) x /20i 0xfe05b приводит к следующим инструкциям

   0xfe05b: cmpw   $0xffc8,%cs:(%esi)
   0xfe060: jo     0xfe062
   0xfe062: jne    0xd241d416
   0xfe068: mov    %edx,%ss
   0xfe06a: mov    $0x7000,%sp
   0xfe06e: add    %al,(%eax)
   0xfe070: mov    $0x2d4e,%dx
   0xfe074: verw   %cx
   0xfe077: xchg   %ebx,(%esi)
   0xfe079: push   %bp
   0xfe07b: push   %di
   0xfe07d: push   %si
   0xfe07f: push   %bx
   0xfe081: sub    $0x70,%sp
   0xfe085: mov    %ax,%di
   0xfe088: mov    0x4(%bx,%si),%si
   0xfe08d: mov    %cs:0x2c(%bp),%bl
   0xfe093: icebp  
   0xfe094: ljmp   *(%esi)

Как вы можете видеть, инструкции совсем не совпадают; Почему это так? Я подозреваю, что gdb не может распознать, где заканчиваются и начинаются отдельные инструкции, поэтому неправильно их интерпретирует. Но опять же, почему так?

...