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

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

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

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

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


person kimi    schedule 25.11.2013    source источник


Ответы (1)


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

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

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

person artless noise    schedule 25.11.2013
comment
Спасибо @artless_noise. Я полностью понимаю проблему передачи указателей между безопасным и незащищенным мирами. Но здесь я пытаюсь выяснить, могу ли я вызвать функцию, присутствующую в драйвере модуля ядра на уровне EL1, для вызова с более высокого уровня привилегий EL2 (гипервизор). По вашему мнению, это возможно? Я понимаю, что у него много проблем с безопасностью, но я пытаюсь сделать это просто для удовольствия! :) Спасибо, и я очень ценю ваше время. - person kimi; 25.11.2013
comment
Вы можете добавить физический адрес в свой SMC API и сопоставить его с безопасным миром. Я не думаю, что у вас есть доступ к виртуальным адресам. Именование EL1 и EL2 кажется специфичным для AAarch64. Если вы хотите получить ответ на этот вопрос, вам следует обновить свой вопрос. Примечание. Гипервизор отличается от trust-zone; они похожи, но разные. См. гипервизор и трастзона. - person artless noise; 26.11.2013
comment
Что вы подразумеваете под картой в безопасном мире? Извините, но я новичок в этом мире Linux и все еще учусь. У меня есть система с TZ и Hyp, уже запрограммированная и работающая как надо. Цель состоит в том, чтобы перехватить вызов SMC в Hyp и вызвать функцию в драйвере ядра. - person kimi; 26.11.2013
comment
Виртуальный адрес Linux не будет иметь значения для гипервизора. Вы должны передать физический адрес. Вы можете использовать общий макрос virt_to_phys() с указателями kmalloc(). Передайте это в интерфейс SMC. В безопасном мире, если у вас включен MMU, вам необходимо сопоставить этот физический адрес с виртуальным адресом (через безопасный MMU). Если в безопасном мире нет MMU, то вы просто используете физический адрес. Я предполагаю, что Linux — это нормальный мир. - person artless noise; 26.11.2013