Что такое вспомогательная / вспомогательная нагрузка? - PullRequest
2 голосов
/ 27 апреля 2020

Эксплойт RIDL требует, чтобы злоумышленник вызвал ошибку страницы, чтобы иметь возможность прочитать устаревшие данные из буфера заполнения строки. Но в соответствии с Об уязвимостях RIDL и «воспроизведении» нагрузок можно также использовать вспомогательную нагрузку.

В этом вопросе упоминается вспомогательная / вспомогательная нагрузки девять раз, но я все еще не мог обернуть голову вокруг того, что делает такая нагрузка или как она срабатывает. Это что-то, связанное с TLB и «вызывающее обход страницы, требующий помощи микрокода».

Может ли кто-нибудь объяснить, что такое вспомогательная / вспомогательная нагрузка, предпочтительно с отработанным примером?

1 Ответ

2 голосов
/ 27 апреля 2020

Вы пропустили оставшуюся часть предложения в этой цитате, которая объясняет, почему при просмотре страницы может потребоваться помощь по микрокоду: «... вызывает просмотр страницы, который требует помощи по микрокоду (чтобы установить бит доступа в запись таблицы страниц) .

ISA x86 говорит, что чтение или запись страницы установит бит «доступ» в записи таблицы страниц (PTE) для этого отображения, если этот бит еще не был установить. Операционные системы могут использовать это, чтобы увидеть, к каким страницам действительно осуществляется регулярный доступ (очистив бит доступа и позволив HW установить его снова), чтобы они могли решить, какие страницы выводить на экран, если им нужно освободить некоторые физические страницы. «грязный» бит, который позволяет ОС узнать, нужно ли синхронизировать страницу обратно в файл или другое хранилище, если таковое имеется (например, как ОС может реализовать mmap(MAP_SHARED,PROT_WRITE))

. Заполняемые записи TLB являются чисто выделенным оборудованием, но обновление этих битов PTE с помощью хранилищ достаточно редко, чтобы их можно было оставить в микрокоде; процессор в основном перехватывает внутренние icrocode и запускает его перед возобновлением.

Аналогичный механизм используется в некоторых процессорах для обработки субнормальных или ненормальных результатов с плавающей запятой, которые не обрабатываются аппаратным FPU. Это позволяет обычному случаю (нормализованным числам с плавающей запятой) иметь меньшую задержку.

Связанный:


Счетчик производительности на Intel (по крайней мере на Skylake): perf stat -e other_assists.any

[Количество микрокодов Assist вызывается HW, кроме FP-assist. Примеры включают AD (страница Access Dirty) и AVX * связанные помощники]


Запуск вспомогательных нагрузок из пространства пользователя: Я не уверен, какой подход хорош.

msync(MS_SYNC) в отображении с файловой поддержкой должен очищать бит Dirty. IDK, если он очистит бит доступа. Предположительно, для fre sh с файловой поддержкой mmap с MAP_POPULATE его бит доступа будет очищен, но он будет подключен к таблице страниц, чтобы не возникло исключение ошибки страницы #PF. Возможно, также работает с MAP_ANONYMOUS.

Если у вас было несколько страниц с очищенными битами доступа, вы можете l oop поверх них, чтобы иметь возможность выполнять множественную вспомогательную загрузку, не делая между ними дорогой системный вызов.


В Linux ядре 4.12 и более поздних версиях я подозреваю, что madvise(MADV_FREE) на частных анонимных страницах очищает бит Dirty, основываясь на том, как справочная страница описывает его. Он также может очищать бит «Доступ», поэтому загрузке также может потребоваться помощь, IDK.

MADV_FREE (начиная с Linux 4.5)
Приложение № больше требует страниц в диапазоне, указанном addr и len. Таким образом, ядро ​​может освободить эти страницы, но освобождение может быть отложено до тех пор, пока не возникнет нехватка памяти. Для каждой из страниц, которые были помечены для освобождения, но еще не были освобождены, операция освобождения будет отменена, если вызывающая сторона записывает на страницу . После успешной операции MADV_FREE любые устаревшие данные (т. Е. Грязные, неписанные страницы) будут потеряны, когда ядро ​​освобождает страницы. Однако последующие записи на страницы в диапазоне будут успешными, и тогда ядро ​​не сможет освободить эти загрязненные страницы, так что вызывающая сторона всегда сможет увидеть только записанные данные. Если нет последующей записи, ядро ​​может освободить страницы в любое время. После освобождения страниц в диапазоне вызывающая сторона увидит страницы с нулевым заполнением по требованию при последующих ссылках на страницы.

Операция MADV_FREE может применяться только к закрытым анонимным страницам (см. Mmap (2)). В Linux до версии 4.12 при освобождении страниц в системе без подкачки страницы в данном диапазоне освобождаются мгновенно, независимо от нагрузки на память.

Или, может быть, mprotect, а может быть mmap(MAP_FIXED|MAP_POPULATE) новая анонимная страница для замены текущей страницы. С MAP_POPULATE он уже должен быть подключен к таблицам страниц HW (не требуя программной ошибки страницы при первом доступе). Грязный бит должен быть чистым, и, возможно, также битом Доступа.


A vpmaskmovd Хранение с маской = 0 (без фактического сохранения) вызовет помощь на странице, защищенной от записи, например, лениво выделенная страница mmap(PROT_READ|PROT_WRITE), которая только прочитана, но не написана. Таким образом, он все еще CoW сопоставлен с общей физической страницей нулей.

Он оставляет страницу чистой, поэтому это может происходить каждый раз в al oop над массивом, если в каждом хранилище есть mask = 0, чтобы не заменять какие-либо элементы.

Это немного отличается от того, что вы хотите. Эта помощь, я думаю, для подавления ошибок, потому что она не должна принимать ошибку #PF страницы. (На самом деле страница защищена от записи, а не просто очищена.)

IDK, если это полезно для целей MDS / RIDL.

Я не тестировал маскированные нагрузки из недавно выделенных mmap(MAP_POPULATE) буфер, чтобы видеть, получают ли они помощь, но оставляют бит Доступным не установленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...