我正在使用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));
}