При экспериментах с разработкой Операционной Системы рано или поздно возникает вопрос отладки. Чаще даже рано, чем поздно. Я сам довольно долго справлялся подручными средствами, типа отладочного вывода, пока неожиданно не наткнулся в форумах на упоминание про встроенный отладчик в Bochs.
Я решил проверить, как отладчик Bochs можно использовать для отладки загрузчика и внутренностей операционной системы. Эта статья описывает, что из этого получилось.
Bochs у меня был установлен давно, я решил заглянуть в инсталляционный директорий и обнаружил, что у Bochs среди прочих выполнимых файлов есть два выполнимых файла bochs.exe и bochsdbg.exe:
Чтобы протестировать загрузку, для начала беру простой Hello World загрузчик:
section .text use16 org 0x7C00 ; программа загружается по адресу 0x7C00 start: mov ax, cs mov ds, ax ; выбираем сегмент данных mov si, message cld ; направление для строковых команд mov ah, 0x0E ; номер функции BIOS mov bh, 0x00 ; страница видеопамяти puts_loop: lodsb ; загружаем очередной символ в al test al, al ; нулевой символ означает конец строки jz puts_loop_exit int 0x10 ; вызываем функцию BIOS jmp puts_loop puts_loop_exit: jmp $ ; вечный цикл message: db 'Hello World!',0 finish: times 0x1FE-finish+start db 0 db 0x55, 0xAA ; сигнатура загрузочного сектора
Записываю его в hello.asm, компилирую: nasm hello.asm -o hello.img
Получаю файл hello, размером 512 байт. Это образ загрузочной дискеты. В первом секторе загрузочный сектор c программой «Hello world»
Запускаю bochsdbg.exe. Открывается стартовое меню:
Дважды кликаю в меню «Disk & Boot». Открывается меню настройки дисков. Указываю что флоппи диск читать из файла hello.img:
Нажимаю OK, в стартовом меню нажимаю на Start. Открывается два окна, окно с виртуальной машиной, и окно с командной строкой для команд отладки. Команды отладки похожи на gdb. Например:
- b 0x7c00 — установить breakpoint на инструкцию по адресу 0x7c00, что соответствует началу загрузочного сектора
- c — продолжить выполнение (continue)
- h — получить в помощь список возможных команд
- h b — получить помощь по конкретной команде (в данном случае break)
После команды ‘c’ (сontinue), Bochs продолжает выполнение и останавливается на первой команде загрузчика, как и хотелось. Чтобы по шагам отлаживаться даю команду ‘n’ (next). Предыдущую команду повторяю простым нажатием на ‘Enter’.
У отладчика много разных команд. Например:
- regs — показать содержимое регистров
- sregs — показать содержимое сегментных регистров
- x c хитрыми параметрами типа x /16b 0x7c00 — покажет содержимое 16 байт по адресу 0x7c00
И т.д. помощь по командам можно получить из командной строки, с помощью команды ‘h’, как я писал выше. А также на сайте разработчиков есть справочник команд и много другой полезной информации, которой стоит пользоваться. Чтобы немного еще проиллюстрировать как это выглядит, еще пара скринов:
Вот, что можно увидеть на экране эмулятора:
Чтобы не создавать конфигурацию Bochs заново при каждом старте, ее можно сохранить после конфигурирования, перед стартом виртуальной машины.
Добавлю также, что отлаживать можно не только реальный режим, но и, к примеру, переход из реального в защищённый. По шагам. Что, конечно же очень удобно и делает Bochs весьма удобным инструментом отладки. Даже если его работа чем-то отличается от реального компьютера, всё равно возможность пошаговой отладки любого места вашего кода, будь даже это ядро операционной системы или загрузчик делают Bochs незаменимым средством.