PCIe 驱动程序 - 用户 space 如何访问它?
PCIe Driver - How does user space access it?
我正在为 Linux 编写一个 PCIe 驱动程序,目前没有 DMA,并且需要知道在用户 space 启用后如何读取和写入 PCIe 设备。
在驱动程序中,我在 probe():
中做了基础知识
pci_enable_device();
pci_request_regions();
pci_iomap();
但是我如何从用户 space 访问此内存以进行读写?我是否将文件操作添加到我的 PCIe 驱动程序?来自 pci_iomap 的内存是否出现在用户 space 代码可以调用的地方:
open('mapped memory location');
mmap(...);
如果有那么地点是什么?
注意: PCIe 设备不会插入任何 Linux 子系统,例如音频、以太网等
您可以使用 register_chrdev
and device_create
. Consider the 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);
如果您只想从内核 space 向用户 space 导出内存并获得中断,请考虑 UIO driver。
有了它,所有的访问都将通过/dev/uioX文件完成。您可以对其执行 mmap() 以导出内存,并且可以读取(阻塞读取)到 "catch" 中断。
UIO 非常适合 PCIe,内核中有 already is a driver。
我正在为 Linux 编写一个 PCIe 驱动程序,目前没有 DMA,并且需要知道在用户 space 启用后如何读取和写入 PCIe 设备。
在驱动程序中,我在 probe():
中做了基础知识pci_enable_device();
pci_request_regions();
pci_iomap();
但是我如何从用户 space 访问此内存以进行读写?我是否将文件操作添加到我的 PCIe 驱动程序?来自 pci_iomap 的内存是否出现在用户 space 代码可以调用的地方:
open('mapped memory location');
mmap(...);
如果有那么地点是什么?
注意: PCIe 设备不会插入任何 Linux 子系统,例如音频、以太网等
您可以使用 register_chrdev
and device_create
. Consider the 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);
如果您只想从内核 space 向用户 space 导出内存并获得中断,请考虑 UIO driver。
有了它,所有的访问都将通过/dev/uioX文件完成。您可以对其执行 mmap() 以导出内存,并且可以读取(阻塞读取)到 "catch" 中断。
UIO 非常适合 PCIe,内核中有 already is a driver。