LINUX.ORG.RU

Assembler. Bootloader. Qemu


1

1

Решил попробывать пойти немного глубже в архитектуру ПК. Начал разбираться с загрузчиками. Так вот, вопрос, как мне отладить загрузчик в qemu? Нашел только способ отладки ядра:

Отладка ядра Linux без интегрированного отладчика под QEMU

# Запускаем QEMU с ядром, которое мы собираемся отлаживать

$ qemu -kernel /boot/bzImg -append "root=/dev/hda" -std-vga -m 256m -s -hda hdd.img &

# Запускаем gdb на основной машине и коннектимся на порт 1234

$ gdb

(gdb) target remote localhost:1234

# Подключаем образ ядра (должен совпадать с отлаживаемым ядром)

(gdb) file vmlinux

загрузчик удобнее в bochs отлаживать, там и дебагер интегрированный. тем более, что gdb криво работает с 16-битным кодом.

arsi ★★★★★
()
Ответ на: комментарий от denisnet

Уже покопался, только, как поставить BREAKPOINT при выполнении?

Проще всего отлаживать примерно так:

mov ax, 0xB800
mov ds, ax
mov byte [0], 'A'
jmp $

Bochs для Линукса крайне убог — все его графические интерфейсы глючны до невозможности. Я даже запускал вендовый под вайном, и то лучше было.

gentoo_root ★★★★★
()
Ответ на: комментарий от denisnet

Это был дебаговый print. И да, в своё время тестировал загрузчик в bochs.

helios ★★★★★
()
Ответ на: комментарий от gentoo_root

> Bochs для Линукса крайне убог — все его графические интерфейсы глючны до невозможности. Я даже запускал вендовый под вайном, и то лучше было.

http://lorquotes.ru/view-quote.php?id=1

и ди, внезапно, у Bochs есть тёплая ламповая консоль :)

arsi ★★★★★
()
Ответ на: комментарий от arsi

и ди, внезапно, у Bochs есть тёплая ламповая консоль :)

Вот только тут маленькая проблемка — если bochs начнёт выводить экран эмулируемой машины в консоль, то от его дебаггера ничего не останется, потому что он должен был быть на этой же консоли. Хоть бы сам попробовал эту консоль, прежде чем советовать.

gentoo_root ★★★★★
()
Ответ на: комментарий от denisnet

Так, на сколькоя я понял, вы занесли в видеобуяер символ 'A'. И что мне это дало?

Стало видно, что программа прошла через определённое место. jmp $ нужен, чтобы она при этом остановилась и не пошла дальше (полезно, если нужно отладить проблему, из-за которой машина перезагружается, чтобы было видно, доходит ли она до определённого места). Вместо jmp $ можно ждать ввода с клавиатуры, тогда получится настоящий breakpoint. Можно выводить разные символы (или в разные места) и делать много breakpoint'ов. Способ, конечно, не настолько гибкий, как дебаггер в bochs, но имеет право на существование.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

> Вот только тут маленькая проблемка — если bochs начнёт выводить экран эмулируемой машины в консоль

как ты этого добился? :)

> Хоть бы сам попробовал эту консоль, прежде чем советовать.

ты не поверишь :)

arsi ★★★★★
()
Ответ на: комментарий от arsi

Кто напишет быстрый старт? Скомпилил bochs, настроил конфиг. Как дебаг провести? Куда копать.

Мой конфиг:

#1.44M 3.5" media (write protected):
floppya: 1_44=/home/denis/Projects/asm/study/fd.img, status=inserted, write_protected=1
boot: floppy, disk
log: bochs.log
error: action=report
debug: action=report

И на сколько я понял, bosch смотрит конфиг в текущей папке всегда?

denisnet
() автор топика
Ответ на: комментарий от arsi

и ди, внезапно, у Bochs есть тёплая ламповая консоль :)

как ты этого добился? :)

Что-то я не понял, сначала сам предлагаешь, а потом спрашиваешь, как этого добиться? Примерно так получается:

http://ompldr.org/vZWtwcA

http://paste.ubuntu.com/1069210/

При этом дебаггер запустить нельзя, потому что консоль занята выхлопами виртуальной машины, а ещё, естественно, не работает графика. Графические интерфейсы на wxWidgets и xlib полностью состоят из тупых багов, например, в 90% случаев открывается окошко такого маленького размера, что весь экран в него не помещается (это в wxWidgets), поэтому приходится по 15 раз перезапускать bochs, пока не появится окно нормального размера. Нормально работает только gui на winapi, но его под вайном приходится запускать.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

У меня GUI на чистых XLib. Все пока работает.

denisnet
() автор топика
Ответ на: комментарий от denisnet

Скомпилил bochs

Дебаггер надо было включать при сборке в опциях configure. Если не включил, можешь пересобирать :)

Как дебаг провести?

Командой «bochsdbg -f путь_к_конфигу». Потом разберёшься, там простая интуитивно понятная консоль, отдалённо напоминающая gdb.

И на сколько я понял, bosch смотрит конфиг в текущей папке всегда?

Нет, ему надо передавать путь параметром -f, иначе запустится с пустым.

gentoo_root ★★★★★
()
Ответ на: комментарий от denisnet

Меня интересует, как мне поставить брекпоинт

Командой b.

посмотреть содержимое регистра.

reg, sreg

У меня GUI на чистых XLib. Все пока работает.

Там всплывающие окошки с ошибками глючили у меня.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

Дебаггер надо было включать при сборке в опциях configure. Если не включил, можешь пересобирать :)

Если вы про этат аргумент, то включил.

--enable-x86-debugger

Нет, ему надо передавать путь параметром -f, иначе запустится с пустым.

Странно, не прередавал и нашел мой конфиг сам)

denisnet
() автор топика

интересно, кто-нибудь мануал qemu читал?

ставишь загрузчик на образ диска и запускаешь qemu -hda hdd.img -S, а потом подключаешься через gdb.

anonymous
()
Ответ на: комментарий от gentoo_root

Там всплывающие окошки с ошибками глючили у меня.

Пока не наблюдал, но я пока с ним работаю 5 минут. Весь выхлоп идет пока в консоль.

denisnet
() автор топика
Ответ на: комментарий от anonymous

интересно, кто-нибудь мануал qemu читал?

ставишь загрузчик на образ диска и запускаешь qemu -hda hdd.img -S, а потом подключаешься через gdb.

Читали, но там нельзя ставить breakpoint.

denisnet
() автор топика
Ответ на: комментарий от denisnet

Странно, не прередавал и нашел мой конфиг сам)

Если его назвать bochsrc.txt, то найдёт. У меня сохранилась привычка ещё с вендового bochs давать его конфигам расширение bxrc, поэтому мои он не находит.

gentoo_root ★★★★★
()
Ответ на: комментарий от denisnet

Пересобирал с --enable-debugger

g++ -o bochs -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -DBX_SHARE_PATH=\"/usr/local/share/bochs\" logio.o main.o config.o load32bitOShack.o pc_system.o osdep.o plugin.o crc.o -Wl,--export-dynamic  iodev/libiodev.a bx_debug/libdebug.a cpu/libcpu.a cpu/cpudb/libcpudb.a memory/libmemory.a gui/libgui.a disasm/libdisasm.a fpu/libfpu.a -lSM -lICE -lX11 -lXpm -lXrandr -lncurses -lreadline -lm -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0
/usr/bin/ld: gui/libgui.a(gtk_enh_dbg_osdep.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/usr/bin/ld: note: 'pthread_create@@GLIBC_2.2.5' is defined in DSO /lib/libpthread.so.0 so try adding it to the linker command line
/lib/libpthread.so.0: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status

denisnet
() автор топика
Ответ на: комментарий от denisnet

> Кто напишет быстрый старт? Скомпилил bochs, настроил конфиг. Как дебаг провести? Куда копать.

http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html

обрати внимание на «./configure --enable-debugger --enable-disasm».

пример конфига (bochsrc):

ata0-master: type=disk, path="disk.img", cylinders=64, heads=16, spt=32
boot: disk

делаем образ диска и запускаем:

dd if=/dev/zero of=disk.img bs=1k count=16k
echo -ne '\x55\xaa' | dd of=disk.img bs=1 seek=510 conv=notrunc
dd if=mbr.bin of=disk.img conv=notrunc
bochs -q
где mbr.bin — твой бутсектор/мбр.

откроется окошко с эмулятором, консоле запустится дебагер. эмулятор остановится перед входом в биос. набери «b 0x7c00» (точка останова на абсолютном адресе бутсектора), потом «c» (продолжить), эмулятор остановится после передачи управления бутсектору.

arsi ★★★★★
()
Ответ на: комментарий от arsi

Спасибо, я это уже проделывал с qeumu, меня интересовал сам процесс debug'а. Вот за док - спасибо)

denisnet
() автор топика
Ответ на: комментарий от anonymous

Так brakpoint получается в начале загрузчика, а мне надо в определенном моменте. Или я не так понял.

Я подключался gdb, но толкового у меня ничего не получилось. А вот bosch не захотел линковаться с либой интерфейса почему-то, когда я сконфигурировал компиляцию с возможностью дебага.

denisnet
() автор топика
Ответ на: комментарий от denisnet

Без интерфейса (--with-x11) с использованием --enable-debugger работает.

denisnet
() автор топика
Ответ на: комментарий от arsi

да, вот так сработало.

а как мне поставить брекпоинт на инструкцию? высчитывать исходя из асемблерного кода? 0x7C00+номер инструкции (но тут возникает вопрос, сколько занимает место каждая инструкция?)

denisnet
() автор топика
Ответ на: комментарий от denisnet

Вот, что мне надо было)

 display_library: x, options="gui_debug"
denisnet
() автор топика
Ответ на: комментарий от denisnet

> а как мне поставить брекпоинт на инструкцию?

u /10 0x7c00

покажет тебе дизассемблинг 10-ти первых инструкций, начиная с адреса 0x7c00. первым в строчке будет собственно адрес.

arsi ★★★★★
()

лучше бохс поковыряй, он хоть и тормозной, но отлаживается по все регистрам на ура, я в нем загрузчик дебажил, когда ось свою писал

marvin_yorke ★★★
()
Ответ на: комментарий от denisnet

Так что лучше qemu поковыряй, он хоть и тормозной, но отлаживается по все регистрам на ура, я в нем загрузчик дебажил.

gadfly ★★
()
Ответ на: комментарий от gadfly

Но у меня dbg 64 битный, он для 32 битных программ иногда некорректно работает, а тут для 16 битного.

denisnet
() автор топика
Ответ на: комментарий от gadfly

Тогда бокс, там с этим проблем нет, но мне его отладчик гораздо меньше нравится, гдб роднее.

Ну да. Просто с графическим отладчиком работать нагляднее.

denisnet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.