Трассировка из кода пользовательского пространства в пространство ядра

Недавно я настроил свою систему для отладки ядра, используя qemu + gdb. В настоящее время я могу установить точки останова, например, на __do_page_fault() и проследить звонок через gdbwin команда). Теперь я хочу следующую задачу: простое C программа, имеющая "hello world" printfзаявление. Проследите последовательность вызовов, начиная с пространства пользователя и заканчивая write() системный вызов (или что-либо в пространстве ядра, которое вызывается во время выполнения этой конкретной программы пользовательского пространства). Я хочу узнать, как программа пользовательского пространства перехватывает системный вызов относительно ядра Linux.

Теперь я сомневаюсь, где установить точку останова? У нас есть код ядра, а также C код программы. Как обойти эту ситуацию? Пожалуйста, дайте нам объяснение с примером.

Благодарю вас!

1 ответ

На мой взгляд, самый простой способ - разделить это на две части.

  1. Поместите точку останова в гостевое ядро, используя хост gdb.
  2. Поместите точку останова в коде пользователя перед инструкцией прерывания, используя целевой GDB в гостевой системе, при ударе - напечатайте стек, используя целевой (in-qemu) GDB Вы получите трассировку стека пространства пользователя.
  3. Продолжить выполнение в гостевой GDB
  4. Точка останова в ядре (мы установили ее на этапе 1) будет попадать в хост gdb. Вывести трассировку стека ядра.

PS Если ваше ядро ​​будет постоянно достигать точки останова (например, syscall для записи определенно используется широко), вы можете использовать условную точку останова, чтобы достичь точки останова только с определенными переданными параметрами.

Другие вопросы по тегам