Как отлаживать модули ядра Linux с помощью QEMU?

Я работаю над научным проектом, который модифицирует некоторый код Kernel Networking, а также включает новый Kernel module.

Я использую QEMU для загрузки модифицированного ядра и теста.

Тем не менее, я обнаружил, что для отладки в некоторой .img требуется полная ОС.
Возможно ли это без него?

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

Ответ 1

Самый простой способ, на мой взгляд, - использовать buildroot http://buildroot.uclibc.org/

клонировать его, настроить его на использование настраиваемого ядра (стандартное пользовательское пространство подходит для запуска, возможно, вы захотите его изменить позже).

он построит ваше ядро ​​и корневую файловую систему. весь процесс занимает около получаса, двадцать минут из которых составляют монстра

моя строка выполнения выглядит примерно так: QEMU-система-i386   -hda rootfs.ext2   -kernel bzImage   -m 512M   -append "root =/dev/sda console = ttyS0"   -местное время   -сериал stdio

и еще несколько опций, касающихся устройства крана

Ответ 2

Минимально полностью автоматизированный пример QEMU + GDB + Buildroot

QEMU + GDB на немодульном ядре Linux подробно рассматривается в: Как отлаживать ядро ​​Linux с помощью GDB и QEMU? и строить модули ядра внутри QEMU at: Как добавить драйвер Linux в качестве пакета Buildroot. Сначала запустите те, кто работает.

Затем я также полностью автоматизировал отладку модуля GDB по адресу: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1c29163c3919d4168d5d34852d804fd3eeb3ba67#kernel-module-debugging

Это основные шаги, которые вы должны предпринять:

  • Скомпилируйте модуль ядра с помощью отладочных символов:

    ccflags-y += -g -DDEBUG
    

    как указано в модуле ядра, не найдены отладочные символы

  • Остановить GDB с помощью Ctrl + C и запустить:

    lx-symbols path/to/parent/of/modules/
    

    Эта удивительная команда, которая определена в GDB Python script внутри исходного дерева ядра Linux, автоматически загружает символы для загруженных модулей, присутствующих в данной директории, рекурсивно всякий раз, когда GDB останавливается.

    Лучший способ сделать эту команду доступной - использовать:

    gdb -ex add-auto-load-safe-path /full/path/to/linux/kernel
    

    как описано в: GDB: команда lx-symbols undefined

  • insmod модуль ядра.

    Это необходимо сделать, прежде чем устанавливать точки останова, потому что мы не знаем, где ядро ​​предварительно вставляет модуль в память.

    lx-symbols автоматически заботится о поиске местоположения модуля (в файловой системе хоста и гостевой памяти!) для нас.

  • Разверните GDB снова с помощью Ctrl + C, установите точки останова и наслаждайтесь.

Если вы чувствовали хардкор, вы могли также полностью отказаться от lx-symbols и найти местоположение модуля после insmod с помощью:

cat /proc/modules

а затем добавьте .ko вручную с помощью

add-symbol-file path/to/mymodule.ko 0xfffffffa00000000