В настоящее время я использую Simics module (см. главу 6), чтобы прослушивать выборки инструкций и доступ к данным, а также выполнять обратные вызовы для всех этих событий, чтобы инструментировать ядро, работающее на Simics x86. Например, я могу создать модуль Simics следующим образом:
/* Initialize our Simics module. */
void init_local(void)
{
const class_data_t funcs = {
.new_instance = ls_new_instance,
.class_desc = "desc",
.description = "A simics module."
};
/* Register the empty device class. */
conf_class_t *conf_class = SIM_register_class(SIM_MODULE_NAME, &funcs);
/* Register our class class as a trace consumer. */
static const trace_consume_interface_t trace_int = {
.consume = (void (*)(conf_object_t *, trace_entry_t *))my_tool_entrypoint
};
SIM_register_interface(conf_class, TRACE_CONSUME_INTERFACE, &trace_int);
}
Делая это, Simics будет вызывать my_tool_entrypoint
при каждой инструкции и при каждом доступе к данным; позволяя мне настроить ядро, которое я использую, как я считаю нужным. Излишне говорить, что это очень крутая и очень мощная функция.
Мои вопросы:
- Доступна ли такая функция для программ, работающих на гипервизоре VMware ESXi (или VMware Workstation)? Если да, то где документация по этой функции?
- Если он недоступен на ESXi, доступен ли он на каких-либо других гипервизорах, таких как Xen?
Обратите внимание, что я НЕ спрашиваю, как запустить Simics под / поверх VMware, Xen, Bochs и т. Д. Я спрашиваю, возможно ли / как запустить обратный вызов при выборке инструкций и доступе к памяти (как я показали, что это возможно с Simics) на другой платформе, такой как VMware, Xen, Bochs, Qemu и т. д.