Я не играл с этим, но мое понимание из документации состоит в том, что для нагрузок (в отличие от хранилищ NT) ничто не может обойти кеш или переопределить строгий порядок типов памяти, как обычный WB (обратная запись). И даже хранилища NT высвобождают уже кэшированные данные, поэтому они не могут нарушить согласованность для того или иного ядра, которое кэшировало данные для строки, которую вы пишете.
Вы можете выполнять слабо упорядоченную загрузку из областей памяти WC (с комбинированием записи) (с помощью prefetchnta или SSE4 movntdqa), но они, вероятно, все еще согласованы на уровне физических адресов.
@ прокомментировала MargaretBloom
IIRC Intel предупреждает разработчика о множественном отображении с разными типами кэша, что в данном случае может быть действительно полезным.
так что, возможно, вы могли бы обойти когерентность кэша с несколькими виртуальными сопоставлениями одной и той же физической страницы.
Я не знаю, возможно ли по-прежнему создавать некогерентный DMA с устройством PCI / PCIe, но это может быть вашей единственной надеждой на получение реального содержимого DRAM без прохождения через кэш. (Большинство (?) DMA в современных системах x86 когерентно, что хорошо для производительности и возможно, потому что контроллеры памяти встроены в ЦП. Так, на процессорах Intel системный агент может отслеживать теги L3, чтобы увидеть, Эта строка кэшируется в любом месте на кристалле параллельно с отправкой запроса в контроллер памяти.)
Существует инструкция INVD
, которая делает недействительными все кэши без предварительной записи, но я думаю, что это включает общий кэш L3 и, возможно, частные кеши всех остальных ядер . Таким образом, вы практически не можете использовать его в системе Linux, где другие ядра потенциально находятся в процессе работы; вы могли бы испортить структуры данных ядра, используя его, а также имитировать сбой питания на машине с NVDIMM для интересующего вас процесса.
Может быть, если вы как-то отключили все остальные ядра ЦП и отключили прерывания на одном работающем ядре
Затем снова включите прерывания. Обработчики прерываний могут в конечном итоге приводить к кэшированию некоторых данных ядра, а некоторых - в памяти, или приводить драйверы устройств к синхронизации с аппаратным обеспечением, если какие-либо прерывания обрабатываются между wbinvd
и invd
.