Таблица страниц x86-64 Глобальный бит

Каждый PTE (запись таблицы страниц) в этом параметре имеет G-бит (G = Global), который контролирует область физической страницы, отображаемой этой записью.

Если бит G установлен, то запись является глобальной для всех процессов, и все они могут получить доступ к физической странице, которую он отображает, с учетом других прав доступа. Если G-бит равен нулю, то запись не глобальная, а частная для процесса. [Ядро устанавливает G-бит для своих страниц, но предотвращает доступ в пользовательском режиме, отключая U-бит (U = пользовательский режим) на своих страницах.]

Если G-бит установлен в PTE пользовательского режима - тот, у которого установлен U-бит - не является ли это брешей в безопасности, поскольку каждый процесс в системе теперь может получить доступ к странице, отображаемой PTE?

Я что-то пропустил? Есть ли способ установить G-бит в PTE пользовательского режима, но сделать его глобальным только среди группы доверенных процессов, а не всех процессов в системе? Можно ли в PTE установить биты G и U?

1 ответ

Да, на x86 G-бит полезен только тогда, когда есть какой-то другой тип управления (например, ограничение его до Ring 0, который используется ядром) или в незащищенной операционной системе 1.

Думайте о G-бите как об оптимизации для системных вызовов: ядро ​​отображает свои страницы как глобальные, поэтому не нужно очищать TLB. Вам все еще нужно очищать TLB при переключении контекста между процессами, но они часто на пару порядков меньше, чем переключатели пользовательского режима ядра <->.

Вы можете представить себе сценарий, в котором страницы G полезны для пользовательских процессов, таких как разделяемая память: переключение между двумя процессами не потребует аннулирования записей TLB для разделяемой памяти, если они знали об этом и использовали G==1 отображение для обоих процессов. Пополнения TLB в наши дни на самом деле не так уж и плохи, потому что современный x86 кэширует множество записей в таблице даже за пределами TLB, чтобы обеспечить быстрое пополнение.

Я не думаю, что установка битов G и U не разрешена, но ядро ​​не собирается так его устанавливать.

В заключение отметим, что вы можете себе представить, что глобальное отображение только для чтения полезно для чего-то вроде механизма vdso. Все процессы отображают эту страницу, но не могут ее изменить, и ядро ​​обновляет ее по мере необходимости. Конечно, я не вижу, как на самом деле заставить это работать, так как ядру потребуется доступ на запись, и, похоже, нет способа выразить "только чтение для кольца 3, r/w для кольца 0" в таблица страниц. Возможно, ядро ​​могло бы использовать другое отображение для этой страницы, но я не уверен, что это законно: иметь отображение, которое переопределяет отображение "G" (поскольку, если отображение G находится в TLB, ЦП может никогда не увидеть переопределение отображения).


1 Технически это может быть полезно в однопользовательской операционной системе, где все процессы пользовательского режима имеют одинаковые привилегии, но ядро ​​все еще защищено от пользовательского режима, но AFAIK эта модель на самом деле не существует в современных ОС.

Другие вопросы по тегам