Estoy escribiendo un controlador PCIe para Linux, actualmente sin DMA, y necesito saber cómo leer y escribir en el dispositivo PCIe una vez que esté habilitado desde el espacio del usuario.
En el controlador hago lo básico en probe():
pci_enable_device(); pci_request_regions(); pci_iomap();Pero entonces, ¿cómo accedo a esta memoria desde el espacio del usuario para leer y escribir? ¿Agrego operaciones de archivo a mi controlador PCIe? ¿Aparece la memoria de pci_iomap en algún lugar donde el código de espacio de usuario puede llamar:
open('mapped memory location'); mmap(...);Si es así, ¿cuál es la ubicación?
Nota: el dispositivo PCIe no se conectará a ningún subsistema de Linux, como audio, Ethernet, etc.
Si solo desea exportar memoria desde el espacio del kernel al espacio del usuario y obtener interrupciones, piense en el controlador UIO .
Con él, todos los accesos se realizarán a través del archivo /dev/uioX. Puede hacer mmap() en él para exportar memoria y puede leer (con una lectura de bloqueo) para "atrapar" la interrupción.
UIO se adapta perfectamente a PCIe, ya hay un controlador en el kernel para ello.
Puede registrar dispositivos usando funciones como register_chrdev y device_create . Considere la fuente del kernel para /dev/null y /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);