Как отлаживать модули ядра 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