我正在关注有关DMA的教程,目标是将数据从ddr移动到ddr的另一部分。在该示例中,它只是使用mmap和dev / mem映射了一个512MB的物理内存,它从某个物理地址(如0x20000000)开始,并向其中写入数据。
我的问题是,由于我们在Linux中使用虚拟内存,因此其他程序可能已经在物理内存的这一部分中使用了某些页面,那么我们如何在不意外损坏其他程序的情况下仍然编写这些内存呢? 谢谢。
这是物理内存的映射部分:
#define DDR_BASE_ADDRESS 0x20000000
off_t dev_base_1 = DDR_BASE_ADDRESS;
memfd_1 = open("/dev/mem", O_RDWR | O_SYNC);
if (memfd_1 == -1)
{
printf("Can't open /dev/mem.\n");
exit(0);
}
printf("/dev/mem opened.\n");
mapped_base_1 = mmap(0, DDR_MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, memfd_1, dev_base_1 & ~DDR_MAP_MASK);