Я пытаюсь отобразить 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;
}
Я уже могу сказать, что я удалил модуль ядра, используемый устройством, так что это не проблема.
Кто-нибудь может мне помочь? Заранее спасибо.