Трассировка из кода пользовательского пространства в пространство ядра
Недавно я настроил свою систему для отладки ядра, используя qemu + gdb. В настоящее время я могу установить точки останова, например, на __do_page_fault()
и проследить звонок через gdb
(с win
команда). Теперь я хочу следующую задачу: простое C
программа, имеющая "hello world
" printf
заявление. Проследите последовательность вызовов, начиная с пространства пользователя и заканчивая write()
системный вызов (или что-либо в пространстве ядра, которое вызывается во время выполнения этой конкретной программы пользовательского пространства). Я хочу узнать, как программа пользовательского пространства перехватывает системный вызов относительно ядра Linux.
Теперь я сомневаюсь, где установить точку останова? У нас есть код ядра, а также C
код программы. Как обойти эту ситуацию? Пожалуйста, дайте нам объяснение с примером.
Благодарю вас!
1 ответ
На мой взгляд, самый простой способ - разделить это на две части.
- Поместите точку останова в гостевое ядро, используя хост gdb.
- Поместите точку останова в коде пользователя перед инструкцией прерывания, используя целевой GDB в гостевой системе, при ударе - напечатайте стек, используя целевой (in-qemu) GDB Вы получите трассировку стека пространства пользователя.
- Продолжить выполнение в гостевой GDB
- Точка останова в ядре (мы установили ее на этапе 1) будет попадать в хост gdb. Вывести трассировку стека ядра.
PS Если ваше ядро будет постоянно достигать точки останова (например, syscall для записи определенно используется широко), вы можете использовать условную точку останова, чтобы достичь точки останова только с определенными переданными параметрами.