Отладка операционной системы - PullRequest
23 голосов
/ 08 января 2010

Я изучал некоторые общие вопросы об операционных системах и задал вопрос. Как будет отлаживать разработчик при разработке операционной системы, то есть отлаживать саму ОС? Какие инструменты доступны для отладки для разработчика ОС?

Ответы [ 6 ]

23 голосов
/ 08 января 2010

Отладка ядра сложная , потому что вы, вероятно, не можете полагаться на сбойный компьютер, чтобы сообщить, что происходит. Кроме того, неправильные коды, вероятно, находятся в страшных местах, таких как обработчики прерываний.

Существует четыре основных метода отладки операционной системы, о которых мне известно:

  1. Проверка работоспособности вместе с выводом на экран.

    Паника ядра в Linux (, известная как "Oops" es ) является отличным примером этого. Люди из Linux написали функцию, которая распечатывает то, что они могут узнать (включая трассировку стека), а затем останавливает все .

    Даже предупреждения полезны. В Linux настроены средства защиты для ситуаций, когда вы можете случайно заснуть в обработчике прерываний. Например, функция mutex_lock проверит (в might_sleep ), находится ли вы в небезопасном контексте и напечатает трассировку стека, если это так.

  2. Отладчик

    Традиционно при отладке все, что делает компьютер, - это вывод по последовательной линии на стабильную тестовую машину. С появлением виртуальных машин вы теперь можете подключить последовательную линию одной виртуальной машины к другой программе на той же физической машине, что очень удобно. Естественно, однако, это требует, чтобы ваша операционная система опубликовала, что она делает, и ждала подключения отладчика. KGDB (Linux) и WinDBG (Windows) - некоторые из таких отладчиков в ОС. VMWare явно поддерживает эту историю .

    Совсем недавно разработчики виртуальных машин выяснили, как отлаживать ядро ​​без последовательной линии или расширений ядра. VMWare реализовал это в своем недавнем материале.

    Проблема с отладкой в ​​операционной системе (на мой взгляд) связана с принципом неопределенности . Прерывания (где наверняка будут большинство ваших серьезных ошибок) являются асинхронными, частыми и недетерминированными. Если ваша ошибка связана с частичным перекрытием двух прерываний, вы не выставите ее с помощью отладчика; ошибка, вероятно, даже не произойдет. Тем не менее, это может, и тогда отладчик может быть полезным.

  3. Детерминированное воспроизведение

    Когда вы получаете ошибку, которая, кажется, появляется только в производстве, вы хотите записать то, что произошло, и воспроизвести ее, как камера слежения. Благодаря профессору, которого я знал в Иллинойсе , теперь вы можете делать это на виртуальной машине VMWare. VMWare и связанные с ней люди описывают все это лучше, чем я, и они предоставляют то, что выглядит как хорошая документация .

    Детерминированное воспроизведение является совершенно новым на сцене, так что до сих пор я не знаю о каких-либо особенно идиоматических применениях. Говорят, это должно быть особенно полезно для ошибок безопасности.

  4. Перемещение всего в пространство пользователя.

    В конце концов, в ядре все еще более хрупко, поэтому есть огромное преимущество в разработке, если следовать дизайну Nucleus (или Microkernel), где вы сокращаете компоненты режима ядра до минимума. Для всего остального, вы можете использовать множество инструментов разработки в пользовательском пространстве, и вы будете намного счастливее. FUSE , расширение файловой системы пользовательского пространства, является каноническим примером этого.

    Мне нравится эта последняя идея, потому что вы как будто написали программу для записи. Циклический, нет?

3 голосов
/ 08 января 2010

В сценарии начальной загрузки (ОС с нуля) вам, вероятно, придется внедрить возможности удаленной отладки (дамп памяти, ведение журнала и т. Д.) В ядре ОС на раннем этапе и использовать отдельный компьютер. Или вы можете использовать виртуальную машину / гипервизор.

В Windows CE есть компонент, называемый KITL - независимый от ядра транспортный уровень. Я думаю, название говорит само за себя.

3 голосов
/ 08 января 2010

Вы можете использовать виртуальную машину: например. код отладки ring0 с помощью bochs / gdb или Отладка ядра NetBSD с помощью qemu

или последовательная линия с чем-то вроде KDB.

1 голос
/ 08 января 2010

протоколирование printf прикрепить к процессу серьезные юнит-тесты и т.д ..

0 голосов
/ 08 января 2010

Отладка операционной системы не для слабонервных. Поскольку ядро ​​отлаживается, ваши параметры будут весьма ограничены. Обильное количество printf операторов - это одна хитрость, и, кроме того, это зависит от того, какая именно «операционная система» отлаживается, мы могли бы говорить о

  • Filesystem
  • Драйверы
  • Управление памятью
  • Raw Disk ввод / вывод
  • Экран ввода / вывода
  • Kernel

Опять же, это очень разнообразное упражнение, так как в приведенном выше примере все они взаимодействуют друг с другом. Еще более сложным является тот факт, что предположим, что вы должны были отлаживать ядро, как бы вы это сделали, если среда выполнения не установлена ​​должным образом (под этим я говорю об ответственности ядра за загрузку двоичных исполняемых файлов).

Некоторые ядра могут (не у всех таковых) включать простой монитор отладки, на самом деле, если я правильно помню, в книге под названием «Разработка собственной 32-битной операционной системы» Ричарда Берджесса, издательство Sams, которую он включил. монитор отладки, который отображает различные состояния процессора, регистров и т. д.

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

Использование обильного количества операторов printf для отображения ошибок, журналов и т. Д. На отдельном терминале или в файле - лучшая строка для отладки, это звучит как кошмар, но это стоило бы усилий для этого.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 08 января 2010

Удаленная отладка с помощью отладчиков ядра, что также можно сделать с помощью виртуализации.

...