【问题标题】:Segmentation fault when maping /dev/mem映射 /dev/mem 时出现分段错误
【发布时间】:2018-11-12 16:47:38
【问题描述】:

我正在尝试将我的 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;
}

为什么我不能读取内存?

【问题讨论】:

  • 始终检查系统调用的返回值,可以提示出现了什么问题。

标签: linux arm embedded embedded-linux mmap


【解决方案1】:

我觉得问题是标志传递给打开 它应该是这样的

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

【讨论】:

  • 来自 linux 程序员手册:参数标志必须包括以下访问模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。没有正确阅读完全是我的错,谢谢!
  • 提到它不会发生。很高兴这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2013-06-03
相关资源
最近更新 更多