Драйвер 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, в ядре для него уже есть драйвер.

Другие вопросы по тегам