Как mmap () исправить адрес - PullRequest
       87

Как mmap () исправить адрес

1 голос
/ 25 сентября 2019

Я пытаюсь записать целое число (1114129) из моего HPS на Cyclone V Altera FPGA из окна PUTTY в 32-битный PIO на стороне FPGA через интерфейс облегченной оси.Я использую mmap () и не могу получить его для сопоставления с адресом, я хочу, чтобы это 0xff206000, вместо этого его сопоставление с адресом 0xb6f31000.Мой код и результат показаны ниже.

#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/mman.h>
#include <sys/time.h> 
#include <math.h> 

#define MAPPED_SIZE 4
#define DDR_RAM_PHYS 0xff206000
#define PAGESIZE 0x1000 
//1114129
int main(void)
{
        int _fdmem;
        void *map;
        int a;
        int c = 1114129;
        const char memDevice[] = "/dev/mem";
        _fdmem = open( memDevice, O_RDWR | O_SYNC );

        if (_fdmem < 0){
                printf("Failed to open the /dev/mem !\n");
                return 0;
        }
        else{
                printf("open /dev/mem successfully !\n");
        }

        a = sysconf(_SC_PAGESIZE);
        printf("page %d", a);
        /* mmap() the opened /dev/mem */
        map = mmap(0, MAPPED_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, _fdmem, DDR_RAM_PHYS & -PAGESIZE);




          if (map == MAP_FAILED) { perror("npheap_alloc()"); exit(1); }


        int volatile * const p = (int *) (map + (0xff206000 % PAGESIZE));
        *p = c;


        printf("value %p", map);
        printf("\nThe memory address of variable var = ptr = %p\n", p);
        printf("\nIndirect access, variable var value = *ptr = %d", *p);


        /* unmap the area & error checking */
        if (munmap(map,MAPPED_SIZE)==-1){
               perror("Error un-mmapping the file");
        }



        /* close the character device */
        close(_fdmem);
}

open /dev/mem successfully !
page 4096value 0xb6f31000
The memory address of variable var = ptr = 0xb6f31000

Indirect access, variable var value = *ptr = 1114129#

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

Аргумент смещения на mmap является байтовым смещением в файле.Указатель, который возвращает mmap, является указателем на то место в файле, которое в вашем случае является указателем на точный адрес, в который вы хотите записать значение.

Итак, когда вы записываете значение, вызапишите его в точное местоположение, на которое указывает map:

int volatile * const map = (int volatile * const) mmap(...);
*map = value;
3 голосов
/ 25 сентября 2019

Я думаю, вы путаете физический адрес (0xff206000) с виртуальным адресом (0xb6f31000).Вам не важно, что представляет собой виртуальный адрес, вы просто указываете, какие страницы по физическому адресу 0xff206000 должны быть сопоставлены с любым виртуальным адресом, который вы можете использовать.

...