我正在尝试在Linux中传递自定义PCIe设备。我没有使用系统调用和编写linux设备驱动程序进行编程的经验。
我为设备加载了uio_pci_generic驱动程序,并且生成了/ dev / uio0作为字符设备。然后我编写了以下C程序,将128K数据从设备转储到文件中。该设备只有BAR0,大小为128K。
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#define MMBLOCK_SIZE (1024*128)
#define PCI_FILE "/dev/uio0"
#define BIN_FILE "dump.bin"
int main() {
int f;
FILE * fdumpptr;
char *ptr;
printf("PCI FILE: %s\n", PCI_FILE);
printf("BIN FILE: %s\n", BIN_FILE);
f = open(PCI_FILE, O_RDWR);
fdumpptr = fopen("dump.bin","w");
if(NULL == fdumpptr)
{
perror("Can't open BIN FILE");
return 1;
}
if(-1 == f)
{
perror("Can't open PCI FILE");
return 1;
}
else
{
printf("PCI FILE opened successfully\n");
}
ptr = mmap(NULL, MMBLOCK_SIZE, PROT_READ, MAP_SHARED, f, 0);
if (MAP_FAILED == ptr)
{
perror("Can't do memory map on PCI FILE");
return 1;
}
else
{
printf("memory map succesfull\n");
}
if (MMBLOCK_SIZE == fwrite(ptr, 1, MMBLOCK_SIZE, fdumpptr))
{
printf("Content dumpped succesffully\n");
}
else
{
printf("Can't write dump file\n");
return 1;
}
return 0;
}
但mmap()
已返回MAP_FAILED
。如果我通过更改#define PCI_FILE "/sys/bus/pci/devices/0000:08:00.0/resource0"
一切正常而使用sysFS访问设备。
据我所知,我可以mmap()/ dev / uio0设备,但它会出错。是否有可能mmap()字符设备?会出现什么问题?
maps
下没有/sys/class/uio/ui0/
目录。这是一个问题指标吗?