Отладка от начала загрузки при помощи gdb и qemu

Если необходимо отладить работу загрузчика операционной системы, то обычный способ в виде gdb ./a.out очевидным образом не подойдёт. Для отладки в подобных ситуациях используются другие способы, один из которых - это использование эмулятора qemu.
Отладка выполняется локально на машине, без использования gdbserver(если быть более точным, то запускается gdbserver, встроенный в qemu).

Запуск qemu со следующими параметрами:

$ qemu-system-x86_64 -s -S -m 512 -hda os.img

Где:

  • -s - сокращение для -gdb tcp::1234, то есть запустить встроенный в qemu gdbserver на порту 1234 с использованием tcp.
  • -S - не запускать процессор сразу, а ждать подключения отладчика и команды от него на старт эмуляции.

Подключение gdb:

$ gdb
(gdb) target remote localhost:1234
(gdb) set architecture i8086
(gdb) break *0x7c00
(gdb) continue

Первая команда gdb осуществляет подключение к gdbserver qemu. Вторая указывает для gdb архитектуру процессора. Третья ставит точку останова на адресе 0x7c00. Данный адрес соответствует адресу размещения загрузчика. Когда компьютер стартует изначально выполняется код BIOS, который опрашивает оборудование, производит начальную конфигурацию и т.д. Последним шагом код BIOS считывает 512 байт MBR из загрузочного диска, размещает их по указанному адресу, предварительно проверив наличие магической константы 0xAA55 в последних двух байтах. Если всё происходит удачно, то управление передаётся по указанному адресу и стартует выполнение кода загрузчика. Последней командой gdb запускает эмуляцию процессора qemu, начинается выполнение кода BIOS qemu.

После этого возможно использовать обычные команды gdb для отладки и дизассемблирования гостевой операционной системы.

Comments

comments powered by Disqus