Идентификаторы адресного пространства, использующие qemu для ядра Linux i386 - PullRequest
1 голос
/ 19 января 2012

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

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

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

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

Носейчас я пытаюсь отследить исполняемый файл, работающий поверх стандартного ядра Linux.Проблема в том, что базовый образ ядра не содержит код для LKM (загружаемых модулей ядра).Также демоны не известны при запуске ядра.

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

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

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

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

1 Ответ

2 голосов
/ 19 января 2012

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

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

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

...