微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在驱动程序中我做了probe()中的基础知识:

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

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

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

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

如何在用户空间和内核空间之间共享内存

如果内核支持IPv6,如何从用户空间进行testing?

如何在Linux中中断用户间的应用程序

来自用户空间Linux的IRQ处理

用户空间访问sk_buff

注意: PCIe设备不能插入任何Linux子系统,如audio,以太网等。

如何从用户空间访问Linux内核中已注册的I2C器件

用户空间中的ALSA PCM播放设备

您可以使用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 devsn",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),devlist[minor].name); } return tty_init(); } fs_initcall(chr_dev_init);

如果你只是想从内核空间输出内存到用户空间并获得中断,那么考虑一下UIO驱动 。

有了它,所有的访问将通过/ dev / uioX文件完成。 你可以在它上面做mmap()来导出内存,你可以读(用阻塞读)来“捕捉”中断。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐