两次映射同一文件的问题
Issues mmaping the same file twice
我正在使用 Raspberry Pi B+,我正在尝试映射 /dev/mem
的两个不同部分 - 第一个能够从位置 [=12] 设置两个引脚的功能=](0x04
字节长),另一个从位置 0x2021 4000
(0x1C
字节长)操作 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
.
的偏移量写入它
我正在使用 Raspberry Pi B+,我正在尝试映射 /dev/mem
的两个不同部分 - 第一个能够从位置 [=12] 设置两个引脚的功能=](0x04
字节长),另一个从位置 0x2021 4000
(0x1C
字节长)操作 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
.