Отладка Операционной Системы c помощью отладчика

При экспериментах с разработкой Операционной Системы рано или поздно возникает вопрос отладки. Чаще даже рано, чем поздно. Я сам довольно долго справлялся подручными средствами, типа отладочного вывода, пока неожиданно не наткнулся в форумах на упоминание про встроенный отладчик в Bochs.

bochs-logo

Я решил проверить, как отладчик Bochs можно использовать для отладки загрузчика и внутренностей операционной системы. Эта статья описывает, что из этого получилось.

Bochs у меня был установлен давно, я решил заглянуть в инсталляционный директорий и обнаружил, что у Bochs среди прочих выполнимых файлов есть два выполнимых файла bochs.exe и bochsdbg.exe:

bochs-executables

Чтобы протестировать загрузку, для начала беру простой 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. Открывается стартовое меню:

bochs-start-menu

Дважды кликаю в меню «Disk & Boot». Открывается меню настройки дисков. Указываю что флоппи диск читать из файла hello.img:

Нажимаю OK, в стартовом меню нажимаю на Start. Открывается два окна, окно с виртуальной машиной, и окно с командной строкой для команд отладки. Команды отладки похожи на gdb. Например:

  • b 0x7c00 — установить breakpoint на инструкцию по адресу 0x7c00, что соответствует началу загрузочного сектора
  • c — продолжить выполнение (continue)
  • h — получить в помощь список возможных команд
  • h b — получить помощь по конкретной команде (в данном случае break)

bochs-debug-window-break-0x7c00

После команды ‘c’ (сontinue), Bochs продолжает выполнение и останавливается на первой команде загрузчика, как и хотелось. Чтобы по шагам отлаживаться даю команду ‘n’ (next). Предыдущую команду повторяю простым нажатием на ‘Enter’.

bochs-debug-window-debug-n

У отладчика много разных команд. Например:

  • regs — показать содержимое регистров
  • sregs — показать содержимое сегментных регистров
  • x c хитрыми параметрами типа x /16b 0x7c00 — покажет содержимое 16 байт по адресу 0x7c00

И т.д. помощь по командам можно получить из командной строки, с помощью команды ‘h’, как я писал выше. А также на сайте разработчиков есть справочник команд и много другой полезной информации, которой стоит пользоваться. Чтобы немного еще проиллюстрировать как это выглядит, еще пара скринов:

bochs-some-debug-commands

Вот, что можно увидеть на экране эмулятора:

bochs-debug-screen

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

Добавлю также, что отлаживать можно не только реальный режим, но и, к примеру, переход из реального в защищённый. По шагам. Что, конечно же очень удобно и делает Bochs весьма удобным инструментом отладки. Даже если его работа чем-то отличается от реального компьютера, всё равно возможность пошаговой отладки любого места вашего кода, будь даже это ядро операционной системы или загрузчик делают Bochs незаменимым средством.

Другие посты на тему экспериментов с HobbyOS разделе OSDev…

Оставьте комментарий