Поведение / политика кэша ЦП для отображений памяти с файловой поддержкой?

Кто-нибудь знает, какой тип поведения или политики кэша ЦП (например, объединение без кэширования при записи) назначается отображаемой памяти? Файл спинками регионы на современных системах x86?

Есть ли способ определить, в чем дело, и, возможно, переопределить поведение по умолчанию?

Windows и Linux являются основными интересующими операционными системами.

(Примечание редактора: вопрос был ранее сформулирован как ввод / вывод с отображением в память, но эта фраза имеет другое специфическое техническое значение, особенно когда речь идет о кэшах процессора. то есть фактические устройства ввода-вывода, такие как сетевые карты или видеокарты, с которыми вы общаетесь с нагрузками / хранилищами.

Этот вопрос на самом деле о том, какую память вы получаете от mmap(some_fd, ...), когда вы не используете MAP_ANONYMOUS и он поддерживается обычным файлом на диске.)

15

Решение

TL: DR. Файлы, отображаемые в память, используют обычную политику обратной записи для страниц кэша страниц, которые они отображают в адресное пространство вашего процесса. Вы должны сделать что-то особенное и специфичное для ОС, если вам нужны страницы, которые не являются WB.


Политика кэширования, применяемая к области адресного пространства, обычно не зависит от операционной системы и зависит только от типа устройства за страницей адресного пространства. Фактически, операционная система может применять любую политику кэширования к любой области памяти, но неправильно назначенная политика кэширования может снизить производительность системы или вообще нарушить системную логику.

Существует как минимум четыре политики кэширования:

  1. Полное кеширование (обратная запись, он же WB).
    Применяется к физическому адресному пространству, сопоставленному с основной памятью (RAM). Используется для повышения производительности подсистемы памяти. Основным свойством таких устройств является то, что их состояние может быть изменено только программным обеспечением и может влиять только на программное обеспечение.

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

  2. Кэширование сквозной записи. (WT),
    Основным свойством таких устройств является то, что их состояние может быть изменено только программным обеспечением, но это изменение должно немедленно повлиять на устройство. В соответствии с этой политикой данные, записанные в регистр устройства ввода-вывода с отображением в памяти, будут одновременно размещены в двух местах: в кэш-памяти и на устройстве. Но когда будет начато чтение данных, данные будут захвачены из кеша без дорогостоящего доступа к устройству.

    Эта политика кэширования может быть полезна для устройства MMIO, которое не записывает свою память, а только читает то, что написал процессор. На практике это редко используется для чего-либо. GPU не такие и пишут видеопамять, поэтому она не используется для видеопамяти. (У GPU нет механизма, позволяющего аннулировать кэши ЦП региона, потому что GPU не является частью домена когерентности ЦП)

  3. Uncacheable, сочетающий запись (WC aka USCW): Слабо упорядоченная память, обычно используемая для отображения видео ОЗУ. Как и без кэширования, за исключением того, что хранилища NT позволяют эффективно записывать целую строку кэша одновременно. movntdqa нагрузки позволяют эффективно читать целые строки кэша, что вы не можете сделать другим способом из регионов WC. Обычные загрузки извлекают данные отдельно для каждой загрузки, даже в пределах одной строки, потому что они не кэшируются.
  4. Отключено кеширование. (UC)
    Применяется практически ко всем устройствам ввода-вывода, поскольку запись в регистр устройства ввода-вывода с отображением в памяти должна иметь немедленный эффект, а чтение из регистра устройства ввода-вывода с отображением в памяти должно возвращать в считыватель фактические данные с устройства. Если к устройству ввода-вывода с отображением в памяти будет применено кэширование, будут применены два отрицательных эффекта:

    1. Запись в регистр IO устройства с отображением в памяти будет отложена до того момента, когда контроллер кеша решит сбросить строку кеша с записанными данными. В результате драйвер не сможет узнать, когда команда, записанная на устройство, вступит в силу.
    2. Чтение данных из отображенного в памяти регистра устройства ввода-вывода может быть кэшировано. И последующие данные, считанные из того же регистра устройства ввода-вывода с отображенной памятью, могут возвращать не фактические данные с устройства, а устаревшие данные из кэша. Из-за этого водителю будет сложно зафиксировать фактическое состояние устройства.

Из-за того, что способ, которым программное обеспечение может определять политику кэширования, зависит только от процессора, тот же алгоритм может применяться в любой операционной системе.
Самый простой способ — захватить содержимое регистра CR3 и, используя его, найти запись таблицы страниц, соответствующую адресу, политику кэширования которого вы хотите знать, и проверить флаги PCD и PWT. Но этот способ не завершен, потому что есть несколько других функций, которые могут повлиять на кэширование (например, кэширование может быть полностью отключено на CR0, см. Также MTRR, PAT).

15

Другие решения

Чтобы добавить к существующему ответу ZarathustrA: В Windows SEC_NOCACHE Обороты этого кеширования. Есть SEC_WRITECOMBINE, но это кажется сломанным (это работает только с SEC_RESERVEили же SEC_COMMIT, что означает только с файлом подкачки, и вы не хотите устанавливать SEC_WRITECOMBINE на что).

2

По вопросам рекламы [email protected]