2016-02-08 10 views
5

Я пишу драйвер PCIe для Linux, в настоящее время без DMA, и вам нужно знать, как читать и писать на устройство PCIe, когда оно включено из пользовательского пространства.PCIe Driver - Как пользовательское пространство доступа к нему?

В драйвере я делаю основы в зонде():

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

Но то, как получить доступ к этой памяти из пространства пользователя, чтобы читать и писать? Добавлять ли файлы в свой драйвер PCIe? память от pci_iomap показывает уровень вверх какое-то место, где код пространства пользователь может позвонить:

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

Если да, то, что это место?

Примечание: PCIe устройства не будет затыкать в любой подсистемы Linux, такие как аудио, Ethernet и т.д.

+0

Не уверен, что это рекомендуемый способ сделать что-то, но другие драйверы ядра выставляют виртуальные устройства, такие как '/ dev/vboxnetctl', которые, как я полагаю, вы можете выдавать команды. Я не уверен, что ядро ​​Linux позволит любой программе пользовательского пространства читать/записывать на устройство PCIe волей-неволей, похоже, что это может быть опасно. –

+0

Я тоже смотрел на это. Нужно ли что-нибудь делать, чтобы мое устройство появилось там? Например, какие API-вызовы я делаю в своем драйвере? – user2205930

+0

Возможно, посмотрите на исходный код драйвера VirtualBox для идей. –

ответ

0

Вы можете зарегистрировать устройства с помощью таких функций, как register_chrdev и device_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); 
+0

Да, я в конце концов создал драйвер устройства символов для моего устройства PCIe. Я бы порекомендовал другим прочитать книгу, посвященную драйверам устройств Linux, глава 3, чтобы узнать больше. Он устарел, но вы можете выбрать некоторые основы, чтобы заставить вас двигаться. – user2205930

2

Если вы просто хотите экспортировать память из пространства ядра в пространство пользователя и получить прерывания, думать о UIO driver.

С его помощью все обращения будут выполняться через/dev/uioX-файл. Вы можете сделать mmap() на нем для экспорта памяти, и вы можете прочитать (с блокировкой чтения), чтобы «поймать» прерывание.

UIO идеально подходит для PCIe, там already is a driver в ядре для него.