Передача указателей на функции из драйвера ядра в гипервизор
Я пытаюсь передать указатель на функцию из EL1 (ядро Android) в EL2(гипервизор), используя вызов SMC и перехватывая вызов SMC в гипервизоре. Я понимаю, что просто передать указатель на гипервизор не будет, потому что это виртуальный компьютер, и он ничего не значит для гипервизора.
Любые комментарии о том, как это сделать? Я хотел бы вызвать функцию из EL2 в основном, а не из EL1.
Я предполагаю, что мне может понадобиться использовать ионную память или может потребоваться конвертировать VA -> IPA/PA
Любая помощь или указатели приветствуются, спасибо!
1 ответ
Как правило, вы не хотите сохранять указатель, который передается таким образом. Лучше передать индекс буфера и скопировать его в часть монитора. Если нормальная ОС возобновляет работу, указатель на память может измениться, что может привести к различным переполнениям и предотвращению проверок условий.
По этой причине часто лучше передавать информацию по значению, если это возможно. Если вы должны передавать буферы, лучше всего использовать некоторые структуры без блокировки в памяти, разделяемой между обычным и безопасным миром. Буфер фиксирован и проиндексирован. Вызов SMC сделан для того, чтобы безопасный мир узнал об изменении состояния. Он копирует буферы и обновляет структуру в разделяемой памяти, чтобы сказать, что это бесплатно. Затем буфер проверяется в частной копии и действует.
Как правило, действовать по обычному мировому адресу не очень хорошая идея. Это очень подвержено ошибкам и его следует избегать. Вот почему микроядра используют передачу сообщений, которая постоянно копирует буферы.