2012-01-19 2 views
1

Друзья. Я работаю над собственным архитектурным симулятором, который используется для моделирования временного эффекта кода, выполняющегося по различным архитектурным параметрам, таким как ядро, иерархия памяти и межсоединения.Идентификаторы адресного пространства, использующие qemu для ядра i386 linux

Я работаю над модулем, который берет фактический след запущенной программы из эмулятора типа «PinTool» и «qemu-linux-user» и передает эту трассировку на симулятор.

До сих пор мой подход был таким: 1) взять objdump бинарного исполняемого файла и проанализировать эту информацию. 2) Теперь эмулятор должен просто передать мне указатель на указатель и другую информацию, такую ​​как load-address/store-address.

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

Но теперь я пытаюсь использовать трассировку исполняемого файла поверх стандартного linux-ядра. Теперь проблема заключается в том, что образ базового ядра не содержит кода для LKM (Loadable Kernel Modules). Кроме того, при запуске ядра демоны не известны.

Итак, мой подход к этому решению: 1) используйте qemu для эмуляции машины. 2) Когда инструкция встречается в первый раз, я проанализирую ее и сохраню эту информацию. Для последующего. 3) создайте вспомогательную функцию, которая отправляет ip, загружает/сохраняет адрес при выполнении команды.

Я застрял в шаге2. как я различаю различные процессы от qemu, который является просто эмулятором и ничего не знает о гостевой ОС?

Я могу изменить планировщик гостевой ОС, но я действительно не в состоянии определить путь вперед.

Извините, если вопрос очень длинный. Я знаю, что мог бы отвлечь часть, но почувствовал, что часть ее дает объяснение контекста проблемы.

ответ

2

В первом случае, используя qemu-linux-user для эмуляции пользовательской моды в одной программе, задача довольно проста, поскольку память является линейной и в эмуляторе нет виртуальной памяти. Второй случай всей эмуляции системы намного сложнее, потому что вы в основном должны разбирать адреса из структур ядра.

Если вы можете получить виртуальные адреса непосредственно из QEmu, ваша задача немного проще; то вам просто нужно определить процесс и все остальное, как в случае с одним процессом. Возможно, вы сможете получить PID, поддельный системный вызов до get_pid().

В противном случае это все похоже на отладку системы из дампа физической памяти. Для этой задачи есть some tools. Они, вероятно, слишком медленны для выполнения каждой инструкции, но вы можете найти там подсказки.

+0

ya, я использую qemu-linux-user для эмуляции пользовательского режима и qemu-system-i386 для полной эмуляции системы. Для полной эмуляции системы проблема заключается именно в том, что вы указали. Зная pid процесса, инструкция которого обрабатывается qemu. Я получаю виртуальный адрес на этапе подготовки к сбою qemu. –

+0

Может ли кто-нибудь указать место в планировщике linux, где я могу выводить pid текущего процесса на какой-то выходной порт. –

Смежные вопросы