ошибка шины при записи memcopy на устройство uio mmap - PullRequest
1 голос
/ 02 октября 2019

Я сейчас пытаюсь получить доступ к общей памяти UIO через memcopy.

Мой подход такой:

  1. open соответствующее устройство
  2. mapпамять через mmap со спецификацией смещения N * getpagesize ()
  3. memcopy / memset до указателя, которыйвозвращается из mmap

Я попытался также с помощью ftruncate после шага 2, что привело к ошибке.

memcopy / memset вызывает ошибку шины , которая обычно являетсяпризнак записи границ файлов.

Через cat / proc / 'pid' / maps Я вижу, что есть сопоставление для / dev / uioX Также / sys/ class / uio / uioX / maps / имеет два каталога карт, из которых я пытаюсь получить доступ ко второму ( map1 , поэтому N = 1 )

Являюсь ли яупустить что-то? Придется ли мне отображать полный размер памяти, указанной в / sys / class / uio / uioX / maps / map1 / size?

Я не смог найти ни одного примера для доступа к памяти через memcopy, есть ли что-то, что мешает memcopy в памяти mioped UIO?

Источники

unsigned char* GetMemPtr(const char *name, unsigned long Size)
{
    long fd;
    long truncret;
    void* MemPtr;

    unsigned long offst;

    printf("Opening: %s with size %u\n" , name, Size);

    fd = open(name, O_RDWR);

    if (fd < 0) {
        printf("Error: open : %u : %s\n", fd, strerror(errno));
    }

    offst = 1 * getpagesize();

    /*truncret = ftruncate(fd, offst + Size);
    if (truncret < 0)
    {
        printf("Error: ftruncate : %s : %d\n", strerror(errno), truncret);

    }*/

    MemPtr = mmap(0, Size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offst);
    if (MemPtr == MAP_FAILED)
    {
        printf("Error: mmap : %p : %s\n", MemPtr, strerror(errno));

    }
    //MemPtr = MemPtr + offst;

    printf("Mem pointer is %p\n", MemPtr);

    memset(MemPtr, 0, Size);

    printf("Pointer is : %p\n" , MemPtr);
    return (unsigned char*) MemPtr;

}

Результатына выходе:
Открытие: / dev / uio0 с размером 4096
Память указателя 0xffff89232000
Ошибка шины (ядро сброшено)

...