7

我正在为 Linux 编写一个 PCIe 驱动程序,目前没有 DMA,并且需要知道一旦从用户空间启用它后如何读取和写入 PCIe 设备。

在驱动程序中,我在 probe() 中进行了基础操作:

pci_enable_device();
pci_request_regions();
pci_iomap();

但是那我如何从用户空间访问这个内存来读写呢?我是否将文件操作添加到我的 PCIe 驱动程序?pci_iomap 中的内存是否显示了用户空间代码可以调用的某个地方:

open('mapped memory location');
mmap(...);

如果是这样,那么位置是什么?

注意: PCIe 设备不会插入任何 Linux 子系统,例如音频、以太网等。

4

2 回答 2

4

如果你只是想将内存从内核空间导出到用户空间并获得中断,请考虑UIO 驱动程序

有了它,所有的访问都将通过 /dev/uioX 文件完成。您可以对其执行 mmap() 以导出内存,并且可以读取(使用阻塞读取)以“捕获”中断。

UIO 非常适合 PCIe,内核中已经有一个驱动程序

于 2016-02-09T08:31:06.800 回答
1

您可以使用 和 等功能注册register_chrdev设备device_create。考虑/dev/null 和 /dev/mem 的内核源代码

static int __init chr_dev_init(void)
{
    int minor;

    if (register_chrdev(MEM_MAJOR, "mem", &memory_fops))
        printk("unable to get major %d for memory devs\n", MEM_MAJOR);

    mem_class = class_create(THIS_MODULE, "mem");
    if (IS_ERR(mem_class))
        return PTR_ERR(mem_class);

    mem_class->devnode = mem_devnode;
    for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) {
        if (!devlist[minor].name)
            continue;

        /*
         * Create /dev/port?
         */
        if ((minor == DEVPORT_MINOR) && !arch_has_dev_port())
            continue;

        device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor),
                  NULL, devlist[minor].name);
    }

    return tty_init();
}

fs_initcall(chr_dev_init);
于 2016-02-08T19:46:38.343 回答