PCIe驱动程序 - 用户空间如何访问它?

use*_*930 6 linux linux-device-driver linux-kernel pci-e userspace

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

在驱动程序中,我在probe()中执行基础知识:

pci_enable_device();
pci_request_regions();
pci_iomap();
Run Code Online (Sandbox Code Playgroud)

但是,如何从用户空间访问此内存以进行读写?我是否将文件操作添加到PCIe驱动程序?来自pci_iomap的内存是否显示用户空间代码可以调用的位置:

open('mapped memory location');
mmap(...);
Run Code Online (Sandbox Code Playgroud)

如果是的话那么位置是什么?

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

ant*_*duh 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);
Run Code Online (Sandbox Code Playgroud)