Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Отлаживаем начальный загрузчик bootloader
Отлаживаем начальный загрузчик bootloader
Вся серия статей:
Пишем операционную систему
gnu ассемблер и начальный загрузчик bootloader
Пишем свой начальный загрузчик bootloader
В предыдущей статье мы немного отошли от пути по которому наметили свое движение
и написали собственный начальный загрузчик исключительно в интересах детального
понимания работы этой программы. Теперь будем учиться отлаживать написанный код.
Я специально для ознакомления установила на рабочий комп debian-testing что бы
первым делом показать как легко это делается в deb дистрибутивах. Смотрю что у меня
есть в репозитории. Это первое - сама виртуалка bochs в которую уже встроен дебагер.
Кроме того нам понадобится выбрать плагин к виртуалке который определит в каком
графическом окне мы будем работать. Так как я привыкла к графике sdl по работе
с чистой qemu то и выбрала этот плагин.
Ни сколько не пострадает функциональность если выбрать плагин к иксам
Один из выбранных пакетов потянет недостающие зависимости.
Перемещаюсь в каталог с проектом
Сразу можно запустить bochs без параметров и машинка любезно
предоставит нам список меню, пройдя по пунктам которого можно создать
локальный конфиг для запуска нашего образа.
[album]465[/album]
Но так как мы в этом пока ни че не
понимаем то пойдем другим путем. Найдем образец файла конфига.
В выводе увидим два файла, первый будет наш, прочтем его а вывод перенаправим
в файл, сохраним тем самым образец для истории.
Теперь нам доступен текст с пояснениями для детального изучения.
Предположу что разбираться даже с хорошо документированным конфигом со старта не
самое продуктивное дело, поэтому предлагаю воспользоваться ниже приведенным,
а самосовершенствование оставить на потом. Локальный конфиг мы соорудим из глобального.
Только по удаляем все лишние для нас строчки то есть те которые будут
на наш взгляд продублированны из глобального конфига. Из большого конфика получится
вот такая вот пиздюрка.
За-а-а-пускаем
Любуемся
[album]466[/album]
Любуемся, любуемся но у меня тайлинг. Окно виртуалки поверх двух обычных
окошек в мозаике не айс. Если попробуем запустить эмулятор в фоне и потом
закрыть родительский терминал то он сперва убьет все дочерние процессы, а
значит и наше с вами рукоделие.
Что делать? Выход есть и я иду к вам.
После запуска закроем терминал
[album]467[/album]
Эта команда позволяет отвязать запускаемый процесс от терминала.
Наглядно удостоверимся какой процесс является родительским для нашей машинки.
Сначала запустим эмулятор без nohup и посмотрим родителей в дереве процессов.
Убъем процесс и запустим вновь но уже с nohup
Вывод более чем красноречивый.
Меня удочерил 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 практически
ни чем не отличается но многим будет гораздо удобнее с наглядным графическим
окошком и возможностью управления мышкой..
Здесь мы не будет использовать 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]
Для тех кто захочет пройти дорогой дебагинга добавлю ложку дегтя в боченок
меда. Надо понимать что некоторые прогаммы с вынесенными функциями, с вызовами
задержки или других обращений к биосу корректно работают только в процессе
реальной работы программы, а во время дебагинга требуют некоторых ухищрений.
Тем не менее грамотно подбранные точки останова могут минимизировать подобные
неудобства. ( ͡• ͜ʖ ͡•)
Пишем операционную систему
gnu ассемблер и начальный загрузчик bootloader
Пишем свой начальный загрузчик bootloader
В предыдущей статье мы немного отошли от пути по которому наметили свое движение
и написали собственный начальный загрузчик исключительно в интересах детального
понимания работы этой программы. Теперь будем учиться отлаживать написанный код.
Я специально для ознакомления установила на рабочий комп debian-testing что бы
первым делом показать как легко это делается в deb дистрибутивах. Смотрю что у меня
есть в репозитории. Это первое - сама виртуалка bochs в которую уже встроен дебагер.
Кроме того нам понадобится выбрать плагин к виртуалке который определит в каком
графическом окне мы будем работать. Так как я привыкла к графике sdl по работе
с чистой qemu то и выбрала этот плагин.
Код: Выделить всё
apt install bochs-sdl
Код: Выделить всё
apt install bochs-x
Перемещаюсь в каталог с проектом
Код: Выделить всё
cd ~/Projects/osdev/
предоставит нам список меню, пройдя по пунктам которого можно создать
локальный конфиг для запуска нашего образа.
[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}
Код: Выделить всё
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 &
окошко освобдившегося терминала для подключения 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
А strace для отладки - не кошерно?
Re: Отлаживаем начальный загрузчик bootloader
Для меня этот способ незнаком.Oleg65 писал(а):А strace для отладки - не кошерно?
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay