Ошибка «Bad file descriptor» при попытке mmap BAR-0 устройства - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь отобразить BAR-0 устройства PCI в виртуальное адресное пространство, чтобы прочитать (а затем изменить) его содержимое. Однако, когда я отображаю его, я получаю следующую ошибку:

Path to BAR-0: /sys/bus/pci/devices/0000:00:16.0/resource0
Error at line 42, file src/main.c (9) [Bad file descriptor]

Я использую 32-разрядную версию Debian 9.1. Я использую следующий код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h> 
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include "../include/eeprom.h"
#include "../include/pci.h"
#include "../include/i2c.h"
#include "../include/types.h"

#define PRINT_ERROR \
    do { \
        fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \
        __LINE__, __FILE__, errno, strerror(errno)); exit(1);\
    } while(0)

#define MAP_SIZE 4096
#define MAP_MASK (MAP_SIZE - 1)

int main (int argc, char* argv[]) {
    uint32_t pci_dev;
    void *mmap_base;
    char *file = {"/sys/bus/pci/devices/0000:00:16.0/resource0"};
    int i;

    printf ("Path to BAR-0: %s\n", file);

    //Open Bar-0 of PCI device
    pci_dev = open (file, O_RDWR | O_SYNC);
    if (pci_dev < 0)
    {
        PRINT_ERROR;
    }

    //Map BAR-0 from physical memory to virtual address space
    mmap_base = mmap (NULL, MAP_SIZE, PROT_WRITE, MAP_SHARED, pci_dev, 0);
    if (mmap_base == (void *)-1 || mmap_base == NULL)  //error here
    {
        PRINT_ERROR;
    }
    printf ("Mapped on address %p of size %d Byte\n", mmap_base, MAP_SIZE);

    return 0;
}

Я уже могу сказать, что я удалил модуль ядра, используемый устройством, так что это не проблема.

Кто-нибудь может мне помочь? Заранее спасибо.

1 Ответ

0 голосов
/ 22 ноября 2018

Я столкнулся с подобной проблемой, когда изучал программирование в Linux Kernal.Запуск программы с правами суперпользователя сработал у меня.

...