Передача указателей на функции из драйвера ядра в гипервизор

Я пытаюсь передать указатель на функцию из EL1 (ядро Android) в EL2(гипервизор), используя вызов SMC и перехватывая вызов SMC в гипервизоре. Я понимаю, что просто передать указатель на гипервизор не будет, потому что это виртуальный компьютер, и он ничего не значит для гипервизора.

Любые комментарии о том, как это сделать? Я хотел бы вызвать функцию из EL2 в основном, а не из EL1.

Я предполагаю, что мне может понадобиться использовать ионную память или может потребоваться конвертировать VA -> IPA/PA

Любая помощь или указатели приветствуются, спасибо!

1 ответ

Решение

Как правило, вы не хотите сохранять указатель, который передается таким образом. Лучше передать индекс буфера и скопировать его в часть монитора. Если нормальная ОС возобновляет работу, указатель на память может измениться, что может привести к различным переполнениям и предотвращению проверок условий.

По этой причине часто лучше передавать информацию по значению, если это возможно. Если вы должны передавать буферы, лучше всего использовать некоторые структуры без блокировки в памяти, разделяемой между обычным и безопасным миром. Буфер фиксирован и проиндексирован. Вызов SMC сделан для того, чтобы безопасный мир узнал об изменении состояния. Он копирует буферы и обновляет структуру в разделяемой памяти, чтобы сказать, что это бесплатно. Затем буфер проверяется в частной копии и действует.

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

Другие вопросы по тегам