代码之家  ›  专栏  ›  技术社区  ›  KulaDamian

memcpy()函数出现分段错误[已关闭]

  •  0
  • KulaDamian  · 技术社区  · 6 年前

    我有以下内存基址,其中包含一些256字节的数据:

    #define TX_PTR 0x40000008
    

    现在我有了下面的数组,它将存储来自TX_PTR的数据。

    unsigned int tx_arr[64];
    int i = 0;
    for (i=0; i<64;i++)
    {
       tx_arr[i]=0;
    }
    

    当我试图通过以下方式将数据从内存基址存储到数组时:

    memcpy(&tx_arr, TX_PTR, 2*32*sizeof(int));
    

    我有一个分割错误。 我在linux中运行这段代码。有什么问题吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Attie    6 年前

    我在zynq板上运行freertos和openamp。

    从这段评论中,我相信 记忆 “是在FPGA的地址空间中实现的,或者FreeRTOS正在运行并已写入该内存。

    如果是这样,那么要访问物理上位于内存中某个点上的数据,需要使用 mmap() .

    Linux进程不位于物理地址上—MMU将虚拟内存映射到物理内存。

    要访问物理内存,您需要使用 mmap() -像这样的:

    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/mman.h>
    
    #define TX_ADDR 0x40000008
    #define TX_LEN  256
    
    void *my_memory;
    int memfd;
    
    memfd = open("/dev/mem", O_RDWR);
    if (memfd == -1) {
        perror("open()");
        exit(1);
    }
    
    my_memory = mmap(NULL, TX_LEN, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, TX_ADDR);
    if (my_memory == NULL) {
        perror("mmap()");
        exit(1);
    }
    
    /* use my_memory to access the data */
    unsigned int tx_arr[64];
    int i;
    
    for (i = 0; i < 64; i++) {
       tx_arr[i] = 0;
    }
    
    memcpy(tx_arr, my_memory, sizeof(tx_arr));
    

    打电话给 mmap() ,内存将在进程中可用' 虚拟地址空间 地址是 my_memory -不使用 TX_PTR .

    还要注意的是 tx_arr 是一个数组,因此可以不使用 &tx_arr .