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

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

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

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

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


person user3051390    schedule 01.02.2017    source источник


Ответы (1)


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

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

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

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

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


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

person BeeOnRope    schedule 01.02.2017
comment
Ядро может отображать данные страницы VDSO в пространство ядра и указывать их в той же физической памяти, что и страницы, отображаемые в пространство пользователя. Оба могут иметь разные ограничения, разрешающие ядру читать/записывать данные и ограничивающие его данными только для чтения для пользовательского режима. - person Michael Petch; 01.02.2017
comment
Ах да, конечно, ядро ​​просто использует другой виртуальный адрес для доступа к нему, и все в порядке. В любом случае, вариант использования VDSO, вероятно, не очень интересен, так как это только одна страница на процесс. @МайклПетч - person BeeOnRope; 01.02.2017
comment
Я думаю, один интересный вопрос: могут ли процессы, работающие под одним и тем же пользователем, читать пространство памяти друг друга сегодня в Linux? Если нет, против модели безопасности, если бы они могли? Если бы все было в порядке, то вы могли бы представить оптимизацию, в которой G-страницы использовались для процессов пользовательского пространства, которые не нужно было бы очищать, когда переключение контекста было на другой процесс от того же пользователя. Я предполагаю, что это может быть полезно для некоторых приложений, которые используют массу различных рабочих процессов и разделяемой памяти... - person BeeOnRope; 01.02.2017
comment
До эпохи CR4.PCIDE = 1 бит G был просто способом предотвратить сброс некоторых записей TLB при переходе на CR3. Процесс может получить доступ к каждой отображенной странице (если у него есть права): глобальной или неглобальной. Нет нарушения безопасности. Даже при CR4.PCIDE = 1, PCID используются как программно контролируемый способ управления кэшами TLB, они связаны с изоляцией процессов лишь косвенно: это скорее фича, не позволяющая ОС сбрасывать TLB при каждом переключении контекста. Так что бит G больше связан с кэшированием, чем с безопасностью. Просто требуется любое сопоставление, оставшееся в TLB, для дефектов ОС, глобальных или нет. - person Margaret Bloom; 02.02.2017
comment
@MargaretBloom - когда вы говорите о переходе на CR3, вы имеете в виду изменение значения CR3? Да, процесс может получить доступ к каждой отображаемой странице, но я понимаю бит G так, что процесс может получить доступ к такой странице, даже если она не отображается! Поскольку запись остается в TLB, ЦП даже не будет проверять, отображена ли страница, поскольку она попала в TLB. Таким образом, он позволяет использовать страницы, которые не сопоставлены с текущим процессом. Я не вижу такой большой разницы между изоляцией и управлением TLB — они действительно идут рука об руку. - person BeeOnRope; 02.02.2017
comment
@BeeOnRope Да, в основном в этом и суть :) С CR4.PCIDE семантика бита G немного изменилась (без каламбура). Я указывал на это, потому что я считаю, что ОП думал, что ЦП в некоторой степени осведомлен о концепции процесса ОС и что изоляция процесса достигается с помощью G = 0 в PTE, в то время как речь идет больше о кэшировании, чем об этом. Во всяком случае, это просто формулировка и интерпретация. - person Margaret Bloom; 03.02.2017
comment
Я думаю, что BeeOnRope прав, говоря, что процесс может получить доступ к такой странице, даже если она не отображается. Проверьте 4.10.3.2 Использование кэшей структуры подкачки для преобразования линейных адресов в архитектурах Intel 64 и IA-32. .. Том 3. В нем говорится, что если процессор находит запись TLB, которая предназначена для номера страницы линейного адреса и связана с текущим PCID (или который является глобальным), он может использовать физический адрес, права доступа и другие атрибуты из этой записи. Это может быть обращение к памяти физической страницы, которая не упоминается в структурах преобразования адресов текущего PCID. - person Alex P.; 21.02.2017
comment
@АлексП. - спасибо, что нашли ссылку в документе. Я предположил, что это должно работать таким образом, потому что как только вы оставляете запись в TLB, процессор просто собирается ее использовать. Быстрый путь — это хит TLB, поэтому не будет никаких медленных проверок разрешений и т. д. Вот почему ОС должна тщательно управлять TLB при планировании процессов и т. д. Вот почему любые сопоставления с G = 1 будут иметь быть очень тщательно управляемым. - person BeeOnRope; 21.02.2017
comment
Думайте о G-бите как об оптимизации системных вызовов: Нет, без смягчения последствий Meltdown ядру не нужно писать CR3 для системных вызовов, поэтому аннулирование TLB не требуется. Бит U/S позволяет ядру оставлять отображаемые страницы ядра во время работы пользовательского пространства. (И на самом деле точки входа ядра должны быть сопоставлены, иначе обработчик прерывания или syscall вызовет ошибку страницы). Бит G является оптимизацией для переключения контекста, позволяющей избежать промахов TLB сразу после записи CR3, все еще находясь в пространстве ядра, позволяя ядру сохранять глобальное сопоставление со всеми процессами пользовательского пространства. - person Peter Cordes; 21.01.2020