【问题标题】:PCIe Driver - How does user space access it?PCIe 驱动程序 - 用户空间如何访问它?
【发布时间】:2023-03-18 09:30:01
【问题描述】:

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

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

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

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

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

如果是,那么位置在哪里?

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

【问题讨论】:

  • 不确定这是否是推荐的做事方式,但其他内核驱动程序会公开像/dev/vboxnetctl 这样的虚拟设备,我假设您可以向其发出命令。我不确定 Linux 内核是否允许任何用户空间程序随意读取/写入 PCIe 设备,这听起来可能很危险。
  • 我也在看那个。为了让我的设备出现在那里,我需要做些什么吗?例如,我在驱动程序中进行了哪些 API 调用?
  • 或许可以看看VirtualBox驱动源代码来获得灵感。
  • 顺便说一句,最好使用pcim_*() API。
  • pcim_*() 到底是什么,我为什么要使用它?有时收集 Linux 文档可能很痛苦,所以请您提供一两句话吗?

标签: linux linux-kernel linux-device-driver pci-e userspace


【解决方案1】:

如果你只是想将内存从内核空间导出到用户空间并获得中断,可以考虑UIO driver

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

UIO 非常适合 PCIe,内核中有already is a driver

【讨论】:

    【解决方案2】:

    您可以使用register_chrdevdevice_create 等函数注册设备。考虑kernel source for /dev/null and /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);
    

    【讨论】:

    • 是的,我最终为我的 PCIe 设备创建了一个字符设备驱动程序。我建议其他人阅读 Linux 设备驱动程序书第 3 章,以了解更多信息。它已经过时了,但你可以选择一些基础知识来帮助你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2011-01-11
    • 2013-02-23
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多