Подтвердить что ты не робот

Кэш-поведение ввода-вывода с отображением памяти

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

Windows и Linux являются основными операционными системами, которые представляют интерес.

4b9b3361

Ответ 1

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

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

  • Полное кэширование (обратная запись). Применяется к физическому адресному пространству, отображаемому в основную память (ОЗУ). Используется для повышения производительности работы подсистемы памяти. Основным свойством таких устройств является то, что это состояние может быть изменено только программным обеспечением и может влиять только на программное обеспечение. Реализация файлов с отображением памяти использует полное кэширование, поскольку они полностью реализованы программным обеспечением (операционной системой), которое считывает фрагмент файла с диска и помещает его в память, а затем возвращает этот фрагмент (возможно, модифицированный) обратно на диск.
  • Кэширование с записью. Применяется к выходным устройствам, таким как память с памятью. Основным свойством таких устройств является то, что его состояние может быть изменено только программным обеспечением, но изменение должно немедленно влиять на устройство. Согласно этой политике данные, записанные в регистр устройств ввода-вывода с отображением памяти, будут размещаться одновременно в двух местах: в кеше и в устройстве. Но когда начнется чтение данных, данные будут записаны из кеша без дорогостоящего доступа к устройству.
  • Отключено кэширование. Применяется к почти всем устройствам ввода-вывода, поскольку запись в регистр устройств ввода-вывода с отображением памяти должна иметь немедленный эффект, и чтение из регистра памяти с отображением памяти должно быть возвращено к фактическим данным считывателя с устройства. Если кэширование будет применено к устройству ввода-вывода с отображением памяти, тогда будут введены два отрицательных эффекта:
    • Запись в регистр устройства ввода-вывода с отображением памяти будет задерживаться до момента, когда контроллер кэша решит сбросить строку кэша с записанными данными. В результате драйвер не сможет узнать, когда команда, записанная на устройство, вступит в силу.
    • Данные считывания из регистра устройства ввода-вывода с памятью могут быть кэшированы. И последующие данные, считываемые из одного и того же регистра устройства ввода-вывода с памятью, могут возвращать не фактические данные с устройства, а устаревшие данные из кеша. Из-за этого драйверу будет сложно управлять фактическим состоянием устройства.

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

Ответ 2

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