问题两次mmaping相同的文件

时间:2015-03-31 18:13:14

标签: c raspberry-pi mmap

我正在使用Raspberry Pi B +,并且我试图mmap /dev/mem的两个不同部分 - 第一个能够设置两个引脚'函数从位置0x2020 00040x04字节长),另一个来操作位于0x2021 40000x1C字节长)的Pi上的BCM2835芯片上的BSC从模函数。

static uint32_t * initMapMem(int fd, uint32_t addr, uint32_t len)
{
    return (uint32_t *) mmap((void*)0x0, len,
       PROT_READ|PROT_WRITE|PROT_EXEC,
       MAP_SHARED|MAP_LOCKED,
       fd, addr);
}

int initialise(void) {
   int fd;

   fd = open("/dev/mem", O_RDWR | O_SYNC) ;

   if (fd < 0)
   {
      fprintf(stderr, "This program needs root privileges.  Try using sudo.\n");
      return 1;
   }

   pinReg = initMapMem(fd, 0x20200004, 0x4);
   bscReg = initMapMem(fd, 0x20214000, 0x1C);

   close(fd);

   if (bscReg == MAP_FAILED)
   {
      fprintf(stderr, "Bad, mmap failed.\n");
      return 1;
   }
   if (pinReg == MAP_FAILED)
   {
      fprintf(stderr, "Bad, mmap failed.\n");
      return 1;
   }
   return 0;
}
{p> initialise()来自main()。使用gdb逐步执行该计划后,我发现bscReg位置正确,但pinReg返回MAP_FAILED(又名0xFFFFFFFF)并设置了errnoEINVAL。在pinReg第一次或第二次MAP_FAILED时,mmap总是发现自己为pinReg,这与它完成的方式无关。

如何将{{1}}设为有效值?

1 个答案:

答案 0 :(得分:2)

第一个mmap()失败,因为您尝试映射的偏移量(0x20200004)未进行页面对齐。在0x20200000创建一个大小至少为8的映射,然后以0x4的偏移量写入它。