novartis 0 16 декабря, 2015 Опубликовано 16 декабря, 2015 · Жалоба Здравствуйте. Закидываю я данные с pci express девайса напрямую в юзер спейс программу. Данные кидаю в буфер озу. Процессором читаю эти данные. Понятно, что процессор читает не саму озу, а данные из кеша, где хранится копия данных из озу. Начитался теории, что строки кеша сопровождаются флагами (MESI, изменено, эксклюзив, шаред, инвалидейт и т.д., и более сложные) Есть ли какие функции для получения статуса кеш строки? Конкретно под линуксом. Чтобы знать, что прочитанная переменная соответствует ее оригиналу в озу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба К участкам памяти, предназначенных для "слива" данных с периферии посредством DMA (PCI Bus Master и т. п.), предъявляется довольно много требований - участок должен быть непрерывен в физической памяти (если только не Scatter-Gather DMA), неперемещаем системой, выровнен с гранулярностью, удобной "железу", и не должен участвовать в страничной перетасовке виртуальной памяти с файлом подкачки с диска (non-pageable). Поэтому кидать данные напрямую в юзер-спейс - это жесть, конечно. Буфер, который вы выделите new или malloc() не будет соответствовать вышеописанным требованиям. Нужен мало-мальский модуль ядра, который умеет выделять буфера с нужными свойствами. Что касается кэширования, то специальным образом программисту не нужно заботиться о кэше - кэш-строки инвалидируются (помечаются, как устаревшие) автоматически контроллером памяти при сторонней модификации памяти посредством DMA, и при следующей попытке чтения перезагружаются из памяти в кэш. Чтобы знать, что прочитанная переменная соответствует ее оригиналу в озу. Тут volatile не забываем (хотя это и не имеет отношения к кэшу, только чтобы компилятор не заоптимизировал переменную в регистры). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться