我写了一个测试程序,就像这样:
fd = open("/dev/mem", O_RDWR);
src = mmap(0x0, 0x1000000, PROT_READ, MAP_SHARED, fd, 0x80000000);/* 0x80000000 is physical start address of DDR on my A8-cortex platform */
dst = malloc(0x1000000);
start_time = get_time()
memcpy(dst, src, 0x1000000);
end_time = get_time();
print_speed();
在我的基于ARM A8-cortex的主板上,它给了我大约400MB / s的速度。然后我改变了上面的测试程序,src缓冲区也被malloc alllocated,再次测试,现在它给我大约1400MB / s,大约快3~4X。
我试着找出原因。首先,我怀疑src内存是通过mmap缓存的,所以我查看了内核中driver / cha / mem.c中的代码。在mmap_mem函数中,我使用printk打印maped地址的页面属性,vma-> vm_pgoff显示0x10f,因此它没有被缓存。 此外,我更改代码并通过vma-> vm_pgoff = pgprot_nocached(vma-> vm_pgoff)将其设置为未缓存类型并再次测试,结果大约为30MB / s。因此,我们可以默认确认/ dev / mem maped内存肯定是缓存的,但与malloced内存相比,它的读取性能非常慢。
然后如何解释这个测试结果?