Además de poder transferir datos desde y hacia la memoria interna, también se pueden transferir desde y hacia memoria externa a través de los puertos de entrada/salida. Estos puertos son creados físicamente por circuitos que decodifican los pines de control, de datos y de dirección del procesador. Están orientados a la comunicación con dispositivos periféricos, y pueden ser de entrada, de salida, o bidireccionales.
A los puertos de E/S del procesador se puede acceder de 2 formas: A través de un espacio separado de direcciones de E/S, o a través de memoria de E/S mapeada. Para acceder mediante la primera opción se recurre a las instrucciones especiales de E/S y un mecanismo especial de protección de E/S. Para acceder mediante la memoria mapeada se recurren al movimiento a través los registros de propósito general y las instrucciones string, con protección proporcionada a través de segmentación. Un beneficio de usar el acceso mediante un espacio separado de direcciones es que está garantizado el completar la escritura en los puertos de E/S antes de que se ejecute la siguiente instrucción.
Físicamente hablando, en los Pentium Pro, Pentium II, y Pentium III una transacción especial de memoria I/O en el bus del sistema indica si las líneas de acceso serán direccionadas a las direcciones de memoria o a las direcciones E/S. El espacio de direcciones de E/S consiste en un fragmento de memoria individual de 64 K direccionable a los 8 bits de los puertos de E/S, enumerados desde 0 a FFFFH (la 'H' es de hexadecimal). Las direcciones desde F8H hasta FF están reservadas, así que no se puede asignar puertos de E/S a ese rango. 2 puertos consecutivos de 8 bits cualesquiera pueden ser usados como uno de 16 bits, y 4 consecutivos como uno de 32 bits. De esta forma el procesador puede transferir datos de 8, de 16 o de 32 bits. Como en la memoria, los puertos de 16 bits deben estar alineados a direcciones pares, de modo que los 16 bits puedan ser transferidos en un ciclo de reloj, y los de 32 bits a direcciones múltiplos de 4. El procesador soporta transferencias hacia puertos no alineados, pero requiere uno o más ciclos de bus extra. El orden exacto de los ciclos de bus para acceder a puertos no alineados no está definido, y no está garantizado que sea el mismo en procesadores IA posteriores.
A los dispositivos de E/S que respondan como un componente de memoria se puede acceder a través del espacio de direcciones de memoria física del procesador. Cuando se usa el mapeado de memoria de E/S, todas las instrucciones del procesador que hagan referencia a la memoria pueden ser usadas para acceder a un puerto de E/S localizado en una dirección de memoria física. Por ejemplo, la instrucción MOV puede mover datos entre cualquier registro y un puerto de E/S mapeado en memoria.
Las instrucciones de E/S del procesador permiten el acceso a los puertos de E/S a través del espacio de direcciones de E/S (estas instrucciones no se pueden usar para acceder a puertos E/S mapeados en memoria), se dividen en 2 grupos: Los que transfieren un ítem único (sea un byte, un word, o un doubleword) entre un puerto de E/S y un registro de propósito general, y los que transfieren una cadena de ítems (cadenas de bytes, de words o de doublewords) entre un puerto E/S y la memoria.
Cuando el procesador está funcionando en modo protegido, existen mecanismos de protección para regular el acceso a los puertos de E/S. Cuando se accede a los puertos E/S mediante el espacio de direcciones de E/S, 2 mecanismos de control regulan el acceso a los puertos. El primero es el campo de nivel de privilegios de E/S en el registro EFLAGS (permite al sistema operativo o al programa establecer el nivel de privilegios necesario para ejecutar la E/S); el segundo es el permission bit map de E/S del segmento de estado de tareas (TSS) (se usa para permitir el acceso limitado a puertos de E/S a programas o tareas de menos privilegios). Cuando se accede a los puertos mediante memoria mapeada, la protección de segmentado normal y los MTRR (en procesadores que los soporten) afectan al acceso a los puertos de E/S.
Cuando se controlan dispositivos de E/S muchas veces es importante que la memoria y las operaciones de E/S se lleven a cabo exactamente en el orden en que fueron programadas. Por ejemplo, un programa si quiere escribir un comando a un puerto E/S, lee el estado del dispositivo E/S en otro puerto de E/S. Es importante que el estado retornado sea el estado del dispositivo ANTES de que reciba el comando, NO el de después. Un método recomendable para realizar esto cuando se accede a los puertos mediante memoria mapeada es usar los MTRR para hacer que no se utilice la caché en el espacio de direcciones de E/S de memoria mapeada. Otro método es introducir una de las instrucciones de serializing (como la instrucción CPUID) entre las operaciones.
Cuando el acceso es por espacio de direcciones E/S, la situación es diferente en dos sentidos: El primero, es que el procesador nunca utiliza el buffer para escrituras de E/S. Por lo tanto el orden no será alterado. El segundo es que el procesador sincroniza la ejecución de instrucciones E/S con la actividad externa del bus.
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario