Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

403
Vistas
Controlador PCIe: ¿cómo accede el espacio de usuario?

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.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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);
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda