Идентификаторы адресного пространства с использованием qemu для ядра i386 linux

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

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

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

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

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

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

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

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

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


person prathmesh.kallurkar    schedule 19.01.2012    source источник


Ответы (1)


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

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

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

person jpa    schedule 19.01.2012
comment
да, я использую qemu-linux-user для эмуляции пользовательского режима и qemu-system-i386 для полной эмуляции системы. Для полной эмуляции системы проблема именно в том, что вы указали. Зная pid процесса, инструкция которого анализируется qemu. Я получаю виртуальный адрес на этапе дизассемблирования qemu. - person prathmesh.kallurkar; 20.01.2012
comment
Может ли кто-нибудь указать место в планировщике Linux, где я могу вывести pid текущего процесса на какой-либо выходной порт. - person prathmesh.kallurkar; 20.01.2012