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