映射时出现分段错误 /dev/mem
Segmentation fault when maping /dev/mem
我正在尝试从我的 FPGA 映射内存到我的 Zedboard SoC 上的 linux 运行。我可以在命令行上使用 devmem 正确读取内容,但是当尝试通过 C 读取它时出现分段错误。
下面显示的准系统代码在尝试打印内存内容时抛出分段错误。我小心地使用页面大小的倍数以避免出现问题:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
typedef unsigned int u32;
int main()
{
int page_size = sysconf(_SC_PAGESIZE);
printf("PAGESIZE = %d\n\r", page_size);
off_t bram_pbase = 0x42000000; // physical base address
u32 *bram32_vptr;
int fd = open("/dev/mem", O_SYNC);
printf("FD opened\n\r");
bram32_vptr = (u32 *)mmap(NULL, 2*page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, bram_pbase);
printf("%d \n\r", bram32_vptr[0]);
close(fd);
return 0;
}
为什么我无法读取内存?
我觉得问题是传递给 open 的标志
它应该看起来像这样
fd = open("/dev/mem", O_RDWR|O_SYNC);
我正在尝试从我的 FPGA 映射内存到我的 Zedboard SoC 上的 linux 运行。我可以在命令行上使用 devmem 正确读取内容,但是当尝试通过 C 读取它时出现分段错误。
下面显示的准系统代码在尝试打印内存内容时抛出分段错误。我小心地使用页面大小的倍数以避免出现问题:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
typedef unsigned int u32;
int main()
{
int page_size = sysconf(_SC_PAGESIZE);
printf("PAGESIZE = %d\n\r", page_size);
off_t bram_pbase = 0x42000000; // physical base address
u32 *bram32_vptr;
int fd = open("/dev/mem", O_SYNC);
printf("FD opened\n\r");
bram32_vptr = (u32 *)mmap(NULL, 2*page_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, bram_pbase);
printf("%d \n\r", bram32_vptr[0]);
close(fd);
return 0;
}
为什么我无法读取内存?
我觉得问题是传递给 open 的标志 它应该看起来像这样
fd = open("/dev/mem", O_RDWR|O_SYNC);