Programación de dispositivos en modo usuario: Acceso MMIO al IO-APIC

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 IO-APIC, que es uno de los componentes del Advanced Programmable Interrupt Controller presente en cualquier sistema de la familia x86 actual, que se encarga de distribuir las interrupciones de los dispositivos entre los procesadores. Puede tomar como punto de partida el ejemplo del Local-APIC presentado en clase.

Por defecto, los registros del primer IO-APIC están disponibles a partir de la dirección física 0xfec00000. Puede consultar el fichero /proc/iomem para verificar si esto es así en su sistema.

Este componente usa un esquema con dos registros: uno de selección de registro (IOREGSEL), donde hay que escribir el índice del registro que se pretende acceder, y uno (IOWIN), tal que lo que se lee o escribe en el mismo afecta al registro seleccionado por IOREGSEL.

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

Se recomienda usar esta referencia para afrontar este trabajo.