如何刷新armv8上的缓存?

时间:2018-08-15 06:33:43

标签: linux caching arm kernel

我正在使用zynqmp CPU,并且我保留了一个内存块(使用设备树)。

然后,开发一个驱动程序,该驱动程序将实现“ mmap”功能。

因此,用户空间应用程序可以通过mmap访问保留内存,我对无缓存mmap使用'pgprot_noncached'。

但是,我也遇到了缓存问题,我在用户空间上写的内容在缓存中。并且在内核中,我使用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));
}

0 个答案:

没有答案