Драйвер PCIe - как пользовательское пространство получает к нему доступ?
Я пишу драйвер PCIe для Linux, в настоящее время без DMA, и мне нужно знать, как читать и записывать на устройство PCIe, как только оно будет включено из пространства пользователя.
В драйвере я делаю основы в probe():
pci_enable_device();
pci_request_regions();
pci_iomap();
Но тогда как мне получить доступ к этой памяти из пространства пользователя для чтения и записи? Добавлять ли файловые операции в мой драйвер PCIe? Отображает ли память из pci_iomap какое-то место, куда может вызвать код пользовательского пространства:
open('mapped memory location');
mmap(...);
Если так, то каково местоположение?
Примечание: устройство PCIe не будет подключаться к каким-либо подсистемам Linux, таким как аудио, Ethernet и т. Д.
2 ответа
Вы можете зарегистрировать устройства, используя такие функции, как 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);
Если вы просто хотите экспортировать память из пространства ядра в пространство пользователя и получать прерывания, подумайте о драйвере UIO.
При этом все обращения будут осуществляться через файл /dev/uioX. Вы можете выполнить mmap() для экспорта памяти и прочитать (с блокировкой чтения), чтобы "поймать" прерывание.
UIO идеально подходит для PCIe, в ядре для него уже есть драйвер.