两次映射同一文件的问题

Issues mmaping the same file twice

我正在使用 Raspberry Pi B+,我正在尝试映射 /dev/mem 的两个不同部分 - 第一个能够从位置 [=12] 设置两个引脚的功能=](0x04 字节长),另一个从位置 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;
}

initialise() 被调用出 main()。使用 gdb 逐步执行程序我发现 bscReg 定位正确,但是 pinReg returns 与 MAP_FAILED(又名 0xFFFFFFFF)和 errno 设置为 EINVAL。无论采用哪种方式,无论是 - pinReg 总是在 mmap 第一次或第二次编辑时发现自己是 MAP_FAILED

如何将 pinReg 设为有效值?

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

的偏移量写入它