1

В современных материнских платах x86/x64 можно найти IOMMU от Intel и AMD. Они позволяют периферийным устройствам выполнять операции DMA (прямой доступ к памяти) в системном ОЗУ, используя виртуальные адреса вместо физической памяти.

Теперь давайте предположим, что периферийное устройство, выполняющее операцию DMA с использованием IOMMU, содержит некоторую память для кэширования ОЗУ системы, чтобы оптимизировать обработку часто используемых данных. Как обеспечить согласованность памяти между кешем периферийного устройства и системной оперативной памятью в этом случае? Всякий раз, когда периферийное устройство изменяет некоторые данные в своем кэше, не записывая их обратно в системное ОЗУ, любой доступ к той же памяти из ЦП будет касаться устаревших данных.

Единственный эффективный вариант, который я вижу, заключается в том, что периферийное устройство сообщает IOMMU, что необходимо сделать недействительной каждую страницу, которую оно считывает из системного ОЗУ, поскольку эта страница с этого момента будет кэшироваться периферийным устройством. Всякий раз, когда ЦП получит доступ к любой странице, ранее прочитанной периферийным устройством, произойдет сбой страницы. Соответственно, обработчик сбоев страниц будет заботиться о том, чтобы сбросить страницу из кэша периферийного устройства и прочитать ее обратно в системную память.

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

Спасибо за помощь!
Дэвид

0