在Zynq 7000上使用mmap

时间:2019-02-25 00:10:28

标签: linux linux-kernel device-tree zynq

我想使用Microblaze软核与在Zed板上运行Linux的Zynq A9 ARM处理器之间的共享内存来测试CPU之间的通信。

在设备树中,我保留了一些内存:

function (.+{.*(.*{(.*{(.*{(.*{(.*{(.*{(.*)}.*)*}.*)*}.*)*}.*)*}.*)*}.*)*.*?})
  1. Zed板的内存为512MB。如果我保留了较高的256MB,则Linux将无法启动。为什么?当我将金额减少到0x0e000000

  2. 我需要使用“无地图”吗?内核不应该使用内存,但是我希望能够使用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>;
   };
  1. 在大多数示例中,我发现:

    mmap(NULL,大小,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_UNINITIALIZED | MAP_FIXED,fd,load_address);

为什么不将物理地址指定为第一个参数,将0指定为偏移量(最后一个参数)?

  1. 系统的页面大小为4096字节。如果我使用该函数写入2890字节的文件,该函数将返回无错误。文件大小为60000字节时,内核会挂起/崩溃。

  2. 我还编写了一个程序,使用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来清除物理内存。

0 个答案:

没有答案