Как очистить кеш на armv8?
Я работаю с процессором zynqmp и резервирую блок памяти (используя дерево устройств).
А затем разработайте драйвер, который реализует функцию "mmap".
Итак, приложение пользовательского пространства может получить доступ к резервной памяти через mmap, я использую pgprot_noncached для nocache mmap.
Но я также столкнулся с проблемой кеша, то, что я записал на пользовательском пространстве, было в кеше. И в ядре я использую smp_mb для очистки кеша, но это бесполезно. В то же время "__flush_dcache_range" показывает "undefined".
Почему pgprot_noncached бесполезен?
Почему smp_mb бесполезен?
Мой тестовый код в ядре:
fdev->base_addr present memremap addr
fdev->base_addr_io present ioremap_nocache addr
my result is:cache mem's data diffient with mem's data
input_address_phy = 0x40014000;
output_address_phy = 0x40018000;
unsigned int i = 0;
for(i = 0; i < datalen; i++)
{
*((int *)(fdev->base_addr+input_address_phy-0x40000000) + i) = 0x3b3b3b3b;
printk("\r\n cache mem data:0x%x \r\n", *((int *)(fdev->base_addr+input_address_phy-0x40000000) + i));
printk("\r\n mem data:0x%x \r\n", *((int *)(fdev->base_addr_io+input_address_phy-0x40000000) + i));
}
printk("\r\n flush \r\n");
smp_mb();
for(i = 0; i< datalen; i++)
{
printk("\r\n cache mem data:0x%x \r\n", *((int *)(fdev->base_addr+input_address_phy-0x40000000) + i));
printk("\r\n mem data:0x%x \r\n", *((int *)(fdev->base_addr_io+input_address_phy-0x40000000) + i));
}