Подробности о загрузке SGX
Можно ли загрузить программу, превышающую память EPC, в анклав? Я чувствую, что в теории это допустимо, потому что
- ОС может свободно менять страницы
EEXTEND
измеряет анклав постепенно на 256 байтов
Таким образом, теоретически кажется возможным загрузить большую программу, используя только одну страницу памяти EPC:
- загрузить 4 Кбайт на страницу EPC
- измерить загруженную страницу
- выселить загруженную страницу
- загрузить следующие 4K байта на ту же страницу EPC, что и в (1)
Я правильно понимаю в теории? Хотя на практике я сразу получил ошибку при загрузке больших программ.
2 ответа
Я задал похожий вопрос на форумах Intel. Резюме [1] полезно.
Краткий ответ: нет, вы не можете в это время загрузить анклав, который больше, чем EPC.
Из-за текущего отсутствия поддержки подкачки (и отсутствия динамического выделения страниц, которое обеспечит v2) это означает, что объединенный размер HeapMaxSize всех анклавов, загруженных одновременно, не может превышать указанные ~90 МБ. [1]
Длинный ответ: в SGX есть два механизма динамического управления памятью:
- анклав может запрашивать дополнительные страницы через EAUG - это поддерживается только в SGXv2, для которого в настоящее время нет аппаратного обеспечения
- ОС может выгружать страницы EPC в обычное ОЗУ (инструкции EWB/ELD), но Windows в настоящее время не поддерживает это
Так почему же вы не можете загрузить анклав больше, чем EPC?
- размер EPC в современных системах ограничен примерно 90 МБ
- Windows в настоящее время не поддерживает обмен этих страниц
- анклав должен запросить все страницы, которые он хочет использовать перед выполнением (EINIT) на оборудовании SGXv1
- размер всех анклавов не должен превышать размер EPC
- Intel резервирует некоторое пространство EPC для своих анклавов управления (цитирование, выделение ресурсов, загрузка анклавов)
Таким образом, ваш анклав должен будет использовать намного меньше 90 МБ размера кучи на текущем оборудовании. Я экспериментировал с эмуляцией SDK и обнаружил, что она допускает максимальный размер кучи примерно 1 ГБ [2]. Будущие версии ОС, мы надеемся, будут поддерживать обмен страниц EPC, что позволяет использовать статические анклавы большего размера. Будущее оборудование SGX позволит динамически распределять страницы, обеспечивая динамические размеры анклавов.
[1] https://software.intel.com/en-us/forums/intel-isa-extensions/topic/607004
[2] 1GiB - 64KiB - TCSnum * 128KiB, где TCSnum - количество потоков. Превышение этого HeapMaxSize приводит к ошибке симуляции
Исследователь здесь, работающий с Intel SGX.
Я просто хотел бы добавить, что Linux поддерживает механизм 2), упомянутый выше, позволяющий шифровать страницы и выгружать их в обычный DRAM. На самом деле это означает, что да, к вашему первоначальному вопросу. Linux умеет создавать анклавы произвольного размера. Однако в его текущей форме (v1) после того, как анклав будет завершен, размер может не расширяться.
Что касается того, является ли это хорошей идеей, ответ определенно нет. Расширение анклавов выше размера EPC приводит к значительному количеству дорогостоящих сбоев страниц, значительно снижающих производительность.