Как выполнить обратную запись грязных строк кэша L1-L2 в ARMv8

Я ищу способ очистить кеш L1-L2 с помощью модуля ядра. Есть ли способ полностью сбросить весь кеш кластера (конфигурация с 4 ядрами) или, что еще лучше, записать обратно грязные строки кеша в основную память?


person Κυριάκος Παρασκευάς    schedule 11.09.2018    source источник


Ответы (3)


Звучит странно, что вы хотите сбросить кеши из модуля ядра. Это должно быть сделано ядром ядра, и вам, как драйверу, не следует об этом беспокоиться.

Есть ли какая-то конкретная причина, по которой вам нужно сделать это в драйвере?

person matthias.bgg    schedule 12.09.2018
comment
Я хочу добиться согласованности данных между SoC и внешними устройствами. Поэтому, если данные на выделенной странице изменяются X, я хочу убедиться, что изменения будут видны Y, что находится за пределами когерентности кеша X. - person Κυριάκος Παρασκευάς; 12.09.2018
comment
так почему бы просто не использовать ключевое слово volatile (см. здесь)? Это предотвращает запись данных в кеш в первую очередь - person jonnyx; 20.09.2018
comment
Ключевое слово @jonnyx volatile указывает компилятору перечитать значение данных вместо того, чтобы предполагать, что оно осталось прежним. Это не то, чего я хочу. - person Κυριάκος Παρασκευάς; 21.09.2018

Я думаю, вы хотите взглянуть на 3.9 из «Understanding the Linux Virtual Memory Manager» [1] от Мела Гормана. Я думаю, что вы ищете flush_cache_page(...)

[1] https://www.kernel.org/doc/gorman/

person matthias.bgg    schedule 12.09.2018
comment
Хороший, но я не могу найти реализацию для архитектуры Arm64, только для более старой руки. Спасибо большое. Все усложняется, поскольку в Armv8 присутствует более сложный контроллер кэша L2. - person Κυριάκος Παρασκευάς; 13.09.2018
comment
Справедливо, но есть и другие методы, реализованные для arm64, вы смотрели на __flush_dcache_area(kaddr, size)? - person matthias.bgg; 23.09.2018
comment
Да, я так и сделал, насколько я читал, он сбрасывает страницу или область из кеша L1 и отправляет ее в кеш L2. - person Κυριάκος Παρασκευάς; 24.09.2018

Что ж, похоже, на самом деле это отличается от того, как кеши очищаются в разных архитектурах. Тем не менее, я не нашел реализации, которая работает. НО, что я сделал, так это нашел запись таблицы страниц (PTE) конкретной страницы, которую я хочу сбросить, и изменил атрибуты памяти на некэшируемые. Затем данные отправлялись прямо в DRAM. (ARMv8) Ура

person Κυριάκος Παρασκευάς    schedule 27.11.2018