novartis 0 December 16, 2015 Posted December 16, 2015 · Report post Здравствуйте. Закидываю я данные с pci express девайса напрямую в юзер спейс программу. Данные кидаю в буфер озу. Процессором читаю эти данные. Понятно, что процессор читает не саму озу, а данные из кеша, где хранится копия данных из озу. Начитался теории, что строки кеша сопровождаются флагами (MESI, изменено, эксклюзив, шаред, инвалидейт и т.д., и более сложные) Есть ли какие функции для получения статуса кеш строки? Конкретно под линуксом. Чтобы знать, что прочитанная переменная соответствует ее оригиналу в озу. Quote Share this post Link to post Share on other sites More sharing options...
gerber 10 December 22, 2015 Posted December 22, 2015 · Report post К участкам памяти, предназначенных для "слива" данных с периферии посредством DMA (PCI Bus Master и т. п.), предъявляется довольно много требований - участок должен быть непрерывен в физической памяти (если только не Scatter-Gather DMA), неперемещаем системой, выровнен с гранулярностью, удобной "железу", и не должен участвовать в страничной перетасовке виртуальной памяти с файлом подкачки с диска (non-pageable). Поэтому кидать данные напрямую в юзер-спейс - это жесть, конечно. Буфер, который вы выделите new или malloc() не будет соответствовать вышеописанным требованиям. Нужен мало-мальский модуль ядра, который умеет выделять буфера с нужными свойствами. Что касается кэширования, то специальным образом программисту не нужно заботиться о кэше - кэш-строки инвалидируются (помечаются, как устаревшие) автоматически контроллером памяти при сторонней модификации памяти посредством DMA, и при следующей попытке чтения перезагружаются из памяти в кэш. Чтобы знать, что прочитанная переменная соответствует ее оригиналу в озу. Тут volatile не забываем (хотя это и не имеет отношения к кэшу, только чтобы компилятор не заоптимизировал переменную в регистры). Quote Share this post Link to post Share on other sites More sharing options...