我想使用Microblaze软核与在Zed板上运行Linux的Zynq A9 ARM处理器之间的共享内存来测试CPU之间的通信。
在设备树中,我保留了一些内存:
function (.+{.*(.*{(.*{(.*{(.*{(.*{(.*{(.*)}.*)*}.*)*}.*)*}.*)*}.*)*}.*)*.*?})
Zed板的内存为512MB。如果我保留了较高的256MB,则Linux将无法启动。为什么?当我将金额减少到0x0e000000
我需要使用“无地图”吗?内核不应该使用内存,但是我希望能够使用mmap来访问它。
我为mmap构建了一个简单的测试程序。该程序将字节文件逐字节写入使用mmap映射的内存区域:
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
mb_shared_mem: buffer@0x10000000 {
no-map;
reg = <0x10000000 0x0e000000>;
};
};
reserved-driver@0 {
compatible = "xlnx,reserved-memory";
memory-region = <&mb_shared_mem>;
};
在大多数示例中,我发现:
mmap(NULL,大小,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_UNINITIALIZED | MAP_FIXED,fd,load_address);
为什么不将物理地址指定为第一个参数,将0指定为偏移量(最后一个参数)?
系统的页面大小为4096字节。如果我使用该函数写入2890字节的文件,该函数将返回无错误。文件大小为60000字节时,内核会挂起/崩溃。
我还编写了一个程序,使用mmap读取内存。我尝试了以下方法:
将file_A的2980字节写入0x1000_0000
将file_B的2980字节写入0x1200_0000
读取2980字节的0x1000_0000> file_A_tst
读取2980个字节的0x1200_0000> file_B_tst
当检查读取文件的内容时,我看到'file_A_tst'等于'file_B_tst'和'file_B'。因此,似乎写入的映射内存实际上没有刷新到物理内存吗?从以前的mmap开始。我需要使用MAP_UNINITIALIZED,因为我不需要Linux来清除物理内存。