Как на аппаратном уровне обеспечивается изоляция адресных пространств в процессоре
Что проверяют
Понимаете ли вы, что изоляцию обеспечивает не ОС сама по себе, а связка из MMU, таблиц страниц и уровней привилегий, которую ОС только настраивает. Следом часто спрашивают про TLB, переключение контекста и иногда про Meltdown.
Как отвечать
- виртуальная память: программа работает с виртуальными адресами, в физические их переводит MMU при каждом обращении. У каждого процесса свои таблицы страниц, поэтому один и тот же виртуальный адрес в двух процессах ведёт в разные физические кадры, а чужие кадры в таблицах просто не отображены;
- таблицы страниц: на x86-64 это дерево из четырёх уровней (с 5-level paging пяти), страница 4 КБ, бывают большие 2 МБ и 1 ГБ. Корень лежит в регистре
CR3, на ARM64 вTTBR0_EL1иTTBR1_EL1; - биты прав: присутствие, запись,
U/S(доступ из пользовательского режима),NX(запрет исполнения). Нарушение вызывает page fault, и ядро решает, подгрузить страницу или послатьSIGSEGV; - кольца привилегий: пользовательский код в ring 3, ядро в ring 0. Привилегированные инструкции, например запись в
CR3, в ring 3 вызывают исключение, поэтому процесс не может перенастроить себе память; - TLB: кеш трансляций. При смене процесса его сбрасывают либо помечают записи идентификатором:
PCIDна x86,ASIDна ARM; - дополнительно:
SMEPиSMAPне дают ядру исполнять и читать пользовательские страницы без явного разрешения, IOMMU ограничивает DMA устройств.
Для C++ это объясняет, почему разыменование nullptr падает с SIGSEGV: нулевая страница намеренно не отображена. Сегментацию упомяните как историю: в 64-битном режиме базы и лимиты сегментов не используются, остались FS и GS для thread-local storage.
Где спотыкаются
Говорят, что изоляцию делает сегментация. В x86-64 она фактически выключена, всё держится на страницах.
Забывают про ядро. Оно отображено в адресное пространство процесса и закрыто битом U/S, а после Meltdown Linux на уязвимых CPU дополнительно убирает его из пользовательских таблиц механизмом KPTI.
Путают изоляцию процессов с защитой от переполнения буфера. Испортить собственный стек изоляция не мешает, для этого есть канарейки, NX и ASLR.