Programación de dispositivos en modo usuario: Acceso MMIO

El objetivo de esta práctica es familiarizarse con la manera en que se realiza la programación de dispositivos que ofrecen acceso MMIO desde código en modo usuario en un sistema Linux.

Linux, como otros sistemas de la familia UNIX, ofrecen acceso a la memoria física a través del fichero /dev/mem: leyendo/escribiendo en la posición X de ese fichero estamos accediendo a la dirección X de la memoria física del sistema. Asimismo, proyectando parte de ese fichero mediante mmap, los accesos a la región proyectada se convierten directamente en accesos a la zona de memoria física asociada. Téngase en cuenta que, si se usa esta técnica de proyección para acceder a los registros de un dispositivo, la variable que se use para esos accesos debería ser identificada como volatile para asegurarse de que todo acceso a la variable corresponde a un acceso al registro del dispositivo vinculado con la misma. Nótese que el principal uso de este fichero es el acceso a los registros de los dispositivos que operan mediante MMIO (de hecho, en algunos sistemas Linux puede no estar habilitado el uso de este fichero para acceder a la parte que almacena la memoria principal del computador).

Como ejemplo práctico, se ha buscado un dispositivo que debería estar presente en prácticamente todos los sistemas (incluso en los virtualizados): el Local-APIC, que es uno de los componentes del Advanced Programmable Interrupt Controller presente en cualquier sistema de la familia x86 actual. Concretamente, hay un dispositivo de tipo Local-APIC por cada procesador, encargándose de entregar al mismo las interrupciones provenientes de otras partes del sistema, principalmente, de los IO-APICs.

En las versiones APIC y xAPIC los registros del IO-APIC están accesibles a través de MMIO (en x2APIC esa misma información está disponible a través de los Model-specific registers y, por tanto, no podrá realizarse este trabajo práctico en un sistema que tenga habilitada esa versión). Por defecto, los registros del Local-APIC están disponibles a partir de la dirección física fee00000 extendiéndose a lo largo de la página de memoria que comienza en esa dirección. Puede consultar el fichero /proc/iomem para verificar si esto es así en su sistema.

El objetivo concreto del trabajo es desarrollar un programa que usando MMIO obtenga e imprima los valores de los dos siguientes registros del Local-APIC:

El alumno deberá revisar la documentación de este dispositivo para obtener la información requerida para afrontar este trabajo (manual para el desarrollador de software para las arquitecturas IA-32 e Intel 64).