Отлаживаем начальный загрузчик bootloader

Отлаживаем начальный загрузчик bootloader

Сообщение nezabudka » 04 ноя 2016, 16:03

Вся серия статей:
Пишем операционную систему
gnu ассемблер и начальный загрузчик bootloader
Пишем свой начальный загрузчик bootloader
В предыдущей статье мы немного отошли от пути по которому наметили свое движение
и написали собственный начальный загрузчик исключительно в интересах детального
понимания работы этой программы. Теперь будем учиться отлаживать написанный код.
Я специально для ознакомления установила на рабочий комп debian-testing что бы
первым делом показать как легко это делается в deb дистрибутивах. Смотрю что у меня
есть в репозитории. Это первое - сама виртуалка bochs в которую уже встроен дебагер.
Кроме того нам понадобится выбрать плагин к виртуалке который определит в каком
графическом окне мы будем работать. Так как я привыкла к графике sdl по работе
с чистой qemu то и выбрала этот плагин.
Код: выделить все
apt install bochs-sdl

Ни сколько не пострадает функциональность если выбрать плагин к иксам
Код: выделить все
apt install bochs-x

Один из выбранных пакетов потянет недостающие зависимости.
Перемещаюсь в каталог с проектом
Код: выделить все
cd ~/Projects/osdev/

Сразу можно запустить bochs без параметров и машинка любезно
предоставит нам список меню, пройдя по пунктам которого можно создать
локальный конфиг для запуска нашего образа.
465
Но так как мы в этом пока ни че не
понимаем то пойдем другим путем. Найдем образец файла конфига.
Код: выделить все
sudo find /usr -name "*bochsrc*"

В выводе увидим два файла, первый будет наш, прочтем его а вывод перенаправим
в файл, сохраним тем самым образец для истории.
Код: выделить все
gunzip -с /usr/share/doc/bochs/examples/bochsrc.gz > bochrc_example

Теперь нам доступен текст с пояснениями для детального изучения.
Предположу что разбираться даже с хорошо документированным конфигом со старта не
самое продуктивное дело, поэтому предлагаю воспользоваться ниже приведенным,
а самосовершенствование оставить на потом. Локальный конфиг мы соорудим из глобального.
Код: выделить все
cp /etc/bochs-init/bochsrc ./bochsrc

Только по удаляем все лишние для нас строчки то есть те которые будут
на наш взгляд продублированны из глобального конфига. Из большого конфика получится
вот такая вот пиздюрка.
Код: выделить все
config_interface: textconfig
display_library: sdl, options="gui_debug"
#display_library: x, options="gui_debug"
megs: 32
cpu: model=atom_n270 #мой любимый i386 проц
floppya: 1_44=boot_first.bin, status=inserted
ata0-slave: type=cdrom, path="/dev/cdrom", status=ejected
boot: floppy
log: bochs.log
mouse: enabled=0


За-а-а-пускаем
Код: выделить все
bochs -f bochsrc

Любуемся
466
Любуемся, любуемся но у меня тайлинг. Окно виртуалки поверх двух обычных
окошек в мозаике не айс. Если попробуем запустить эмулятор в фоне и потом
закрыть родительский терминал то он сперва убьет все дочерние процессы, а
значит и наше с вами рукоделие.
Что делать? Выход есть и я иду к вам.
Код: выделить все
nohup bochs -f bochsrc &

После запуска закроем терминал
467
Эта команда позволяет отвязать запускаемый процесс от терминала.
Наглядно удостоверимся какой процесс является родительским для нашей машинки.
Сначала запустим эмулятор без nohup и посмотрим родителей в дереве процессов.
Код: выделить все
pstree -s $(pidof bochs-bin)
systemd───sh───lxterminal───bash───bochs-bin───{bochs-bin}

Убъем процесс и запустим вновь но уже с nohup
Код: выделить все
pstree -s $(pidof bochs-bin)
systemd───bochs-bin───{bochs-bin}

Вывод более чем красноречивый.
Меня удочерил systemd, чут ли не сам Поттеринг, был бы он постарше. o(¬‿¬ )o

В графическом окошке дебагера можно работать выбирая нужные опции в меню
программы, но как по мне гораздо удобнее вводить через командную строку.
В самом низу есть полоска, область для ввода команд с клавиатуры.
Что бы запустить наш загрузчик и посмотреть на его работу достаточно
в командной строке ввести "continue" или просто "c". Не забывайте делать
графисеское окно эмулятора активным что бы работать с меню загрузчика.
468
Что бы пошагово отлаживать программу нам будет необходимо обозначить
точку останова. Введем команду останова в начале загрузочного сектора.
Для этого нужно переключиться на окно дебагера и нажать комбинацию Ctrl+C
если мы запускали программу загрузчика. Если нет пропустим этот шаг и
сразу введем
break 0x7c00
И запустим программу
continue
Если мы до этого не запускали программу и графическое окошко эмулятора
было черным как на 3 картинке, то программа начнет работу, запустится
работа биоса и остановится перед самым выполнением нашей программы.
Если мы уже запускали эмулятор командой "continue" то после назначения
брейкпойнта и запуска, нужно переключится на окошко эмулятора и нажать
лубую клавишу. Программа остановится и на экране мы увидим строчку
"Booting from floppy..."
469
Далее нам остается только шагать по строчкам используя команду "step"
или "next".
С левой части окошка отображаются значения регистров на каждом шаге
выполнения программы а в правой части я включила вывод стека в меню
"View"

В федоре bochs мне запустить не удалось. Только после того как я собрала
его заново из сходников со своими параметрами сборки. Во вторых в федоре
нет такого удобного графического окошка с полной раскладкой карты регистров.
Ну или может у меня просто не получилось грамотно настроить этот эмулятор.
В любом случае существует альтернативный способ отладки который мне нравится
куда больше чем работа с bochs.
Запустим загрузчик в эмуляторе qemu со специальными опциями, а дебажить
будем удаленно через фронтенд к дебагеру - ddd. Замечу сразу мне вполне комфортна
работа в обычном gdb из командной строки но работа в надстройке ddd практически
ни чем не отличается но многим будет гораздо удобнее с наглядным графическим
окошком и возможностью управления мышкой..
Код: выделить все
qemu-system-i386 -fda bootloader.bin -boot a -s -S -vnc none &

Здесь мы не будет использовать nohup потому что нам будет нужно
окошко освобдившегося терминала для подключения ddd (gdb)
Нажмем еще раз "enter" и терминал опять будет в нашем распоряжении.
Запускаем сам отладчик
ddd
470
(А вот здесь можно применить nohup)
Подключаемся введя в нижней части окошка строчки
target remote localhost:1234
set arch i8086

Установим брейкпойнт
break *0x7c00
Стартуем программу
continue
Она сама остановится на назначенной точке.
471
Небольшое замечание. Шаги по программе теперь будут выглядеть по другому
stepi (i означает инструкция)
Можете сами оценить на сколько удобно все делать родными в linux
средствами, не прибегая к сторонним эмуляторам. А главное этот способ работает
на всех дистрибутивах одинаково. Еще надо признать, я очень плохо разбираюсь в
графических окошках разных программ и надо полагать там скрыто много интересных
функций которые остались для меня не замеченными.
472
Для тех кто захочет пройти дорогой дебагинга добавлю ложку дегтя в боченок
меда. Надо понимать что некоторые прогаммы с вынесенными функциями, с вызовами
задержки или других обращений к биосу корректно работают только в процессе
реальной работы программы, а во время дебагинга требуют некоторых ухищрений.
Тем не менее грамотно подбранные точки останова могут минимизировать подобные
неудобства. ( ͡• ͜ʖ ͡•)
Последний раз редактировалось nezabudka 04 ноя 2016, 16:13, всего редактировалось 1 раз.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватар пользователя
nezabudka
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 614
Фото: 180
Стаж: 3 года 6 месяцев 26 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 147 раз.

Отлаживаем начальный загрузчик bootloader

Спонсор

Спонсор
 

Re: Отлаживаем начальный загрузчик bootloader

Сообщение Oleg65 » 04 ноя 2016, 16:13

А strace для отладки - не кошерно?
Аватар пользователя
Oleg65
Местный говорун
Местный говорун
 
Сообщений: 863
Стаж: 3 года 9 месяцев 26 дней
Откуда: г.Коломна Моск.обл.
Благодарил (а): 74 раз.
Поблагодарили: 209 раз.

Re: Отлаживаем начальный загрузчик bootloader

Сообщение nezabudka » 04 ноя 2016, 16:18

Oleg65 писал(а):

А strace для отладки - не кошерно?

Для меня этот способ незнаком.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватар пользователя
nezabudka
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 614
Фото: 180
Стаж: 3 года 6 месяцев 26 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 147 раз.


Вернуться в Другие языки

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron