Почему отладка в режиме ядра затруднена?

Я понимаю назначение режима ядра и пользовательского режима и то, как происходит переход от первого ко второму. Тем не менее, многие источники утверждают, что сбой, происходящий в режиме ядра, трудно отладить и что это следует делать удаленно, например, путем подключения через telnet (вот пример).

Почему так сложно отлаживать? Почему вы не можете просто присоединить отладчик (ядра) к одному из потоков ядра и использовать его как обычно?


person qdii    schedule 05.01.2012    source источник


Ответы (2)


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

При обычной отладке у вас есть два полностью изолированных процесса — отладчик и то, что вы отлаживаете. Они «ровесники», созданные равными. Отлаживаемый процесс не может касаться отладчика, что бы он ни делал (и, вероятно, даже не знает, что он существует). С другой стороны, отладчик может взаимодействовать с отлаживаемым процессом фиксированными и предсказуемыми способами, которые всегда применимы ко всем обычным пользовательским процессам.

Пример: как бы вы отлаживали интерфейс клавиатуры, если это локальная отладка, или код RS232, если он работает через последовательный порт? Драйвер сетевой карты или сетевой стек, если он по сети? Установка точки останова в одном из них будет невосстановимой, потому что вы потеряете доступ к устройству, управляющему отладчиком. В худшем случае, как бы вы отладили отладчик ядра? С помощью GDB вы могли бы, по крайней мере теоретически, присоединить экземпляр GDB к другому экземпляру GDB без особых проблем. В пространстве ядра это просто невозможно, потому что выше нет промежуточного уровня.

person Flexo    schedule 05.01.2012
comment
Хорошо, я думаю, что понимаю это. Пожалуйста, поправьте меня, если я ошибаюсь: означает ли это, что все процессы, работающие в режиме ядра, используют одно и то же адресное пространство? И если это правда, то есть ли для этого причина? - person qdii; 05.01.2012
comment
Да, адресное пространство ядра совместно используется всеми процессами. Если у вас есть общий код ядра (не драйвер для конкретного устройства) для ядра Linux, вы можете использовать QEMU. Вы можете подключить gdb к программному обеспечению, работающему на QEMU, и, таким образом, вы можете пошагово выполнять код ядра, как пользовательский код, используя gdb. Но если ваш код специфичен для устройства, например драйвера устройства, для которого недоступна эмуляция, ваше программное обеспечение не будет выполняться. - person Saurabh; 23.01.2012
comment
@user420536 user420536 вопрос на самом деле не указывает Linux или какую архитектуру. Бывают случаи очень разные. - person Flexo; 23.01.2012
comment
@awoodland - Конечно, в мире больше ядер, чем ядра Linux. В своем ответе я упомянул две вещи: а) адресное пространство в ядре является общим для всех процессов, и это верно для всех ядер. б) использование QEMU в качестве примера для подключения отладчика к ядру, как хочет OP и его ограничения. - person Saurabh; 25.01.2012

Вы не можете отлаживать ядро ​​интерактивно (или локально), потому что само ядро ​​отвечает даже за вывод изображения на монитор (путем связи с соответствующим драйвером дисплея) и не только за это. Я бы поставил Ваш вопрос по-другому: можно ли отлаживать ядро ​​проще, чем через телнет?

На этот вопрос мой ответ: да, это так. По крайней мере, на архитектурах X86/X64 с использованием виртуализации. Я использую VirtualBox для запуска гостевой ОС, которую я могу отлаживать на своей локальной машине. Я также использую VirtualKD (http://virtualkd.sysprogs.org/), который значительно ускоряет связь между отладочной машиной (хостом) и виртуальной машиной.

VirtualKD содержит пакет, который изменяет boot.ini гостевой Windows, поэтому вы можете включить отладку во время загрузки, выбрав соответствующий пункт меню, который Windows отображает вам.

person LietKynes    schedule 10.01.2012