Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов.
8(977)608-78-62 adm@nixm.ru

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

Ответить
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

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

Сообщение nezabudka »

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

Код: Выделить всё

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

Код: Выделить всё

apt install bochs-x
Один из выбранных пакетов потянет недостающие зависимости.
Перемещаюсь в каталог с проектом

Код: Выделить всё

cd ~/Projects/osdev/
Сразу можно запустить bochs без параметров и машинка любезно
предоставит нам список меню, пройдя по пунктам которого можно создать
локальный конфиг для запуска нашего образа.
[album]465[/album]
Но так как мы в этом пока ни че не
понимаем то пойдем другим путем. Найдем образец файла конфига.

Код: Выделить всё

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
Любуемся
[album]466[/album]
Любуемся, любуемся но у меня тайлинг. Окно виртуалки поверх двух обычных
окошек в мозаике не айс. Если попробуем запустить эмулятор в фоне и потом
закрыть родительский терминал то он сперва убьет все дочерние процессы, а
значит и наше с вами рукоделие.
Что делать? Выход есть и я иду к вам.

Код: Выделить всё

nohup bochs -f bochsrc &
После запуска закроем терминал
[album]467[/album]
Эта команда позволяет отвязать запускаемый процесс от терминала.
Наглядно удостоверимся какой процесс является родительским для нашей машинки.
Сначала запустим эмулятор без 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". Не забывайте делать
графисеское окно эмулятора активным что бы работать с меню загрузчика.
[album]468[/album]
Что бы пошагово отлаживать программу нам будет необходимо обозначить
точку останова. Введем команду останова в начале загрузочного сектора.
Для этого нужно переключиться на окно дебагера и нажать комбинацию Ctrl+C
если мы запускали программу загрузчика. Если нет пропустим этот шаг и
сразу введем
break 0x7c00
И запустим программу
continue
Если мы до этого не запускали программу и графическое окошко эмулятора
было черным как на 3 картинке, то программа начнет работу, запустится
работа биоса и остановится перед самым выполнением нашей программы.
Если мы уже запускали эмулятор командой "continue" то после назначения
брейкпойнта и запуска, нужно переключится на окошко эмулятора и нажать
лубую клавишу. Программа остановится и на экране мы увидим строчку
"Booting from floppy..."
[album]469[/album]
Далее нам остается только шагать по строчкам используя команду "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
[album]470[/album]
(А вот здесь можно применить nohup)
Подключаемся введя в нижней части окошка строчки
target remote localhost:1234
set arch i8086

Установим брейкпойнт
break *0x7c00
Стартуем программу
continue
Она сама остановится на назначенной точке.
[album]471[/album]
Небольшое замечание. Шаги по программе теперь будут выглядеть по другому
stepi (i означает инструкция)
Можете сами оценить на сколько удобно все делать родными в linux
средствами, не прибегая к сторонним эмуляторам. А главное этот способ работает
на всех дистрибутивах одинаково. Еще надо признать, я очень плохо разбираюсь в
графических окошках разных программ и надо полагать там скрыто много интересных
функций которые остались для меня не замеченными.
[album]472[/album]
Для тех кто захочет пройти дорогой дебагинга добавлю ложку дегтя в боченок
меда. Надо понимать что некоторые прогаммы с вынесенными функциями, с вызовами
задержки или других обращений к биосу корректно работают только в процессе
реальной работы программы, а во время дебагинга требуют некоторых ухищрений.
Тем не менее грамотно подбранные точки останова могут минимизировать подобные
неудобства. ( ͡• ͜ʖ ͡•)
Последний раз редактировалось 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
Аватара пользователя
Oleg65
Местный говорун
Местный говорун
Сообщения: 859
Зарегистрирован: 18 янв 2015, 10:56
Откуда: г.Коломна Моск.обл.

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

Сообщение Oleg65 »

А strace для отладки - не кошерно?
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

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

Сообщение nezabudka »

Oleg65 писал(а):А strace для отладки - не кошерно?
Для меня этот способ незнаком.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Ответить

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