Разделение памяти TrustZone
Я читаю об ARM Trustzone по этой ссылке. Я понимаю, что используя TrustZone, можно разделить память на безопасные и незащищенные области. Поставщики могут использовать это для запуска защищенной ОС.
Что мне интересно, так это поддержка гранулярности для этого раздела? Просто ли может быть блок памяти, помеченный как "безопасный", и может быть только один такой блок памяти на ОС? Есть ли у TrustZone возможность разделять память для отдельных процессов?
Допустим, у меня есть файл.so (гипотетический пример) для приложения Linux. Возможно ли, чтобы один и тот же код в процессе A мог быть помечен как защищенный в виртуальном адресе от 0x1000 до 0x2000, тогда как в процессе B он мог быть помечен как защищенный в виртуальном адресе от 0x5000 до 0x6000?
1 ответ
Разбиение TrustZone происходит на уровне физической памяти, поэтому части вашего вопроса на уровне процессов на самом деле не применяются. Обратите внимание, что Linux как незащищенная ОС не может даже видеть защищенную память, поэтому использование виртуальных сопоставлений для недоступных адресов будет бесполезным; однако защищенная ОС имеет возможность отображать как защищенные, так и незащищенные физические адреса благодаря биту NS в записях таблицы страниц.
Что касается того, как происходит это физическое разбиение, это зависит от реализации. TZC-380, на который ссылается ваша ссылка, поддерживает 2-16 регионов с минимальной гранулярностью 32 КБ; его преемник TZC-400 имеет 9 регионов и доходит до степени детализации 4 КБ. Другие реализации все еще могут отличаться, хотя степень детализации ниже 4 КБ маловероятна, так как это было бы в значительной степени непригодно для процессора с включенным MMU. Кроме того, в системе обычно есть некоторые вещи, которые будут привязаны только к карте защищенной памяти (например, к программному интерфейсу TZC), и это часто включает в себя выделенную защищенную SRAM.