Esto es algo un poco más subjetivo que lo demás.
El manual es muy interesante en el sentido práctico de programación a bajo nivel porque expone muy claramente el funcionamiento de procesadores Intel en los que están basados los actuales Pentium 4, Core Duo, etc. que son casi omnipresentes en cualquier computadora de todo el mundo. Sin embargo, se necesita tener al menos una base de programación a bajo nivel para poder ir llevando todo lo que se indica en este manual. Este tipo de programación es mas pesada y complicada que los lenguajes de alto nivel, por eso es también mas minoritaria; pero funciona mejor.
Lo más relevante de este manual es lo primero, la parte de E/S y la identificación del procesador; la introducción, el entorno de ejecución, cómo se llama a los procedimientos, interrupciones y a las excepciones, como se direccionan los datos, los registros (a memoria, a puertos E/S...), cómo se comunica un procesador con el "exterior", cómo un programa sabe en qué tipo de máquina se está ejecutando y actúe en consecuencia. La FPU y la tecnología MMX es algo más secundario (pero también importante) porque es más importante saber lo que hacen, que cómo lo hacen. Antes eran útiles para muchas cosas, pero ahora lo son mucho más porque las interfaces gráficas están mucho mas evolucionadas y necesitan hacer cálculos numéricos mucho más rápidos que las de antes, por ejemplo.
Me ha sorprendido la cantidad de la memoria y de información que debe manejar el procesador para controlar todos los campos, puertos de entrada, de salida, bidireccionales, excepciones, interrupciones, privilegios...todo eso a velocidades increíbles (los procesadores actuales están en el orden de 3.000.000.000 operaciones por segundo), poniendo al límite la resolución óptica de los dispositivos utilizados para la fabricación del microprocesador (cada vez se usan longitudes de onda más bajas).
Lo que es curioso, es que en procesadores con soporte para SSE2 en adelante (que soporta punto flotante), siga en uso también la FPU...tendré que investigar ;-)
Bueno, espero que esto os pueda ayudar algún día :-)
viernes, 28 de noviembre de 2008
Indicaciones para escribir editores de excepciones SIMD en punto flotante
Igual que para las excepciones de punto flotante de la FPU, el procesador escoge una de dos posibles acciones cuando de una instrucción de las extensiones Streaming SIMD surge una excepción en punto flotante:
- Si la excepción está enmascarada, es producido un resultado por defecto que es aceptable en la mayoría de las situaciones. No se emite indicación externa, pero la correspondiente bandera de excepción en el MXCSR se establece y puede ser examinada más tarde.
- Si no está enmascarada, un editor de excepciones registrado previamente por el usuario será invocado a través de la excepción vector 19 del SIMD en punto flotante.
La rutina para invocar al editor de excepciones a través de la interrupción en el vector 19 es normalmente parte del kernel del software del sistema. Una entrada en la tabla de descripción de interrupciones debe ser seleccionada previamente por este vector. Algunos compiladores usan librerías run-time para ayudar en la edición de excepciones en punto flotante. Si cualquier operación en punto flotante de la FPU va a ser ejecutada y es posible que produzca una excepción en punto flotante, entonces la rutina de edición de excepciones debe desactivar todas las excepciones en punto flotante o la debe implementar como nueva candidata. Si no es el caso, la rutina debe borrar el estado de las banderas de las excepciones FPU, o enmascarar todas las excepciones en punto flotante de la FPU. Para las excepciones en punto flotante de las extensiones Streaming SIMD, las banderas de excepciones en MXCSR no tienen por que borradas, incluso si continúan no enmascaradas. Las excepciones en este caso ocurren inmediatamente, y una bandera de estado de excepciones de las extensiones Streaming SIMD que está activada cuando la correspondiente excepción no está enmascarada, no generará una excepción. Acciones típicas ejecutadas en este bajo nivel de rutina de editor de excepciones son:
- incrementar un contador de excepciones para mostrarlas más tarde.
- mostrar información de diagnóstico.
- abortar ejecuciones posteriores, o usar punteros de excepciones para construir una instrucción que funcione sin ellas, y ejecutarla.
- guardar información sobre excepciones en una estructura de datos que pase a tener un nivel más alto en el uso de editores de excepciones.
En la mayoría de los casos habrá 3 componentes en un editor de excepciones en punto flotante de bajo nivel: un 'prólogo', un 'cuerpo', y un 'epílogo'. El prólogo ejecuta funciones que deben protegidas de posibles interrupciones por servicios de mayor prioridad. Cuando el proceso crítico se completa, el prólogo puede re-activar las interrupciones y permitir a los editores de interrupciones de mayor prioridad reemplazar al editor de excepciones. El cuerpo examina la información de diagnóstico y hace una respuesta dependiente de la aplicación. Finalmente el epílogo hace lo inverso al prólogo; restaura el estado normal del procesador para retomar la ejecución normal.
Una instrucción de las extensiones Streaming SIMD se puede ejecutar en paralelo con otras similares, con instrucciones de enteros, en punto flotante, o instrucciones MMX. La sincronización de excepciones será también necesaria, y es similar a lo que expliqué con la sincronización de los editores de excepciones de la FPU.
- Si la excepción está enmascarada, es producido un resultado por defecto que es aceptable en la mayoría de las situaciones. No se emite indicación externa, pero la correspondiente bandera de excepción en el MXCSR se establece y puede ser examinada más tarde.
- Si no está enmascarada, un editor de excepciones registrado previamente por el usuario será invocado a través de la excepción vector 19 del SIMD en punto flotante.
La rutina para invocar al editor de excepciones a través de la interrupción en el vector 19 es normalmente parte del kernel del software del sistema. Una entrada en la tabla de descripción de interrupciones debe ser seleccionada previamente por este vector. Algunos compiladores usan librerías run-time para ayudar en la edición de excepciones en punto flotante. Si cualquier operación en punto flotante de la FPU va a ser ejecutada y es posible que produzca una excepción en punto flotante, entonces la rutina de edición de excepciones debe desactivar todas las excepciones en punto flotante o la debe implementar como nueva candidata. Si no es el caso, la rutina debe borrar el estado de las banderas de las excepciones FPU, o enmascarar todas las excepciones en punto flotante de la FPU. Para las excepciones en punto flotante de las extensiones Streaming SIMD, las banderas de excepciones en MXCSR no tienen por que borradas, incluso si continúan no enmascaradas. Las excepciones en este caso ocurren inmediatamente, y una bandera de estado de excepciones de las extensiones Streaming SIMD que está activada cuando la correspondiente excepción no está enmascarada, no generará una excepción. Acciones típicas ejecutadas en este bajo nivel de rutina de editor de excepciones son:
- incrementar un contador de excepciones para mostrarlas más tarde.
- mostrar información de diagnóstico.
- abortar ejecuciones posteriores, o usar punteros de excepciones para construir una instrucción que funcione sin ellas, y ejecutarla.
- guardar información sobre excepciones en una estructura de datos que pase a tener un nivel más alto en el uso de editores de excepciones.
En la mayoría de los casos habrá 3 componentes en un editor de excepciones en punto flotante de bajo nivel: un 'prólogo', un 'cuerpo', y un 'epílogo'. El prólogo ejecuta funciones que deben protegidas de posibles interrupciones por servicios de mayor prioridad. Cuando el proceso crítico se completa, el prólogo puede re-activar las interrupciones y permitir a los editores de interrupciones de mayor prioridad reemplazar al editor de excepciones. El cuerpo examina la información de diagnóstico y hace una respuesta dependiente de la aplicación. Finalmente el epílogo hace lo inverso al prólogo; restaura el estado normal del procesador para retomar la ejecución normal.
Una instrucción de las extensiones Streaming SIMD se puede ejecutar en paralelo con otras similares, con instrucciones de enteros, en punto flotante, o instrucciones MMX. La sincronización de excepciones será también necesaria, y es similar a lo que expliqué con la sincronización de los editores de excepciones de la FPU.
Indicaciones para escribir un editor de excepciones de FPU
Como escribí en el capítulo "Unidad en punto flotante", la IA soporta 2 formas de acceso a editores de excepciones para manipular excepciones no enmascaradas de la FPU; el modo nativo y el compatible con MS-DOS. Lo primero de todo: ¿Por qué MS-DOS no entra en el 'modo nativo'? Los primeros procesadores no tenían unidad de punto flotante integrado en el mismo chip, la tenían en un chip coprocesador numérico separado. El primer coprocesador de ese tipo fue el Intel 8087. Para la salida de la señal de excepciones en punto flotante, este chip tiene un pin de salida INT que los diseñadores del 8087 recomendaron que fuera rutado a través de un controlador de interrupciones programable (PIC) hacia el pin INTR del procesador. Entonces el número del vector de interrupciones que lo acompaña podía ser usado para el acceso al editor de excepciones en punto flotante. Sin embargo, el diseño original del PC de IBM y del sistema operativo MS-DOS usaron un mecanismo diferente para editar la salida INT del 8087. Lo conectaban directamente al pin NMI de entrada del procesador. Entonces el editor de interrupciones de NMI tenía que diferenciar entre interrupciones producidas por una excepción en punto flotante, o por algún otro evento NMI.
Cuando la compatibilidad MS-DOS está activa para los procesadores Intel486 y Pentium y el pin de entrada IGNNE# se activa, la señal FERR# se genera así: 1º, cuando una instrucción FPU causa una excepción FPU no enmascarada, el procesador usa un método "a plazos" para reportar el error, es decir que el procesador no responde inmediatamente (está un tiempo 'congelado'); 2º Cuando se congela, activa la salida FERR#; 3º El procesador congelado espera a una interrupción externa, producida por un hardware en respuesta a la salida FERR#; 4º En sistemas compatibles con MS-DOS, FERR# está conectada a la entrada IRQ13 en la cascada del PIC, y éste genera una interrupción 75H. El método de comunicar el error "a plazos" es usado por todas las excepciones causadas por instrucciones básicas de aritmética, para las demás las guarda en memoria. Sin embargo algunas instrucciones de la FPU con algunas excepciones, usa un método inmediato para comunicar los errores.
Algunas implementaciones hardware han sido menos robustas porque dependían del editor de excepciones para borrar la excepción de petición de interrupción de la FPU en el PIC ANTES de que el editor causara FERR# por no ser confirmado por el borrado de la excepción de la misma FPU.
Si la compatibilidad está activa para procesadores de la familia P6, todo es casi idéntico a lo anterior, salvo que aquí todas las excepciones para todas las instrucciones de FPU causan un error que se comunica inmediatamente; FERR# se activa tan pronto como la FPU detecta un error no enmascarado, no hay esperas. El problema es que puede ser que la interrupción sea servida después de la siguiente instrucción de la secuencia del código, por lo tanto habrá un retraso que depende de la implementación del hardware externo.
Dependiendo de opciones determinadas por el software de diseño de sistemas, el procesador escoge una de dos opciones para actuar en caso de excepción numérica: La 1ª es que selecciona las excepciones por sí mismo produciendo un fix-up por defecto, que en la mayoría de las ocasiones es lo más razonable. Esto permite al programa numérico continuar sin molestias. Cuando detecta una excepción enmascarada, se establece una bandera en el registro numérico de estado pero no se especifica cuándo ocurrió ni dónde fue provocada; En la 2ª un software editor de excepciones puede ser invocado para editarla. Cuando una excepción numérica no está enmascarada y ocurre la excepción, la FPU para la ejecución de las instrucciones numéricas posteriores y provoca una llamada a un software editor de excepciones, que puede implementar cualquier procedimiento de recuperación.
La administración de sincronización requiere un control para las excepciones antes de dejar al procesador que cambie el valor usado por la FPU. Es importante recordar que casi todas las instrucciones numéricas pueden producir excepciones numéricas en determinadas circunstancias. La sincronización de excepciones se refiere a que el editor de excepciones inspecciona y se ocupa de la excepción en el contexto donde se ocurrió. Si la ejecución simultánea está permitida, la reserva del procesador cuando reconoce la excepción a veces no está en el contexto en el que se dio. Pudo haber cambiado sus registros internos y ejecutado un programa completamente diferente en el tiempo en el que ocurrió la excepción. Si el editor de excepciones no puede recapturar el contexto original, no se puede determinar la causa de la excepción ni se puede recuperar completamente de ella. Para resolver este problema, la FPU tiene registros especiales actualizados en el inicio de cada instrucción numérica, para describir la reserva del programa numérico cuando se intenta ejecutar la instrucción que provoca el fallo. Esto proporciona herramientas de ayuda al editor de excepciones para recapturar el contexto original, pero el código de la aplicación debe estar pensado con esta sincronización. Sin embargo, los compiladores de lenguajes de alto nivel ya proporcionan automáticamente toda sincronización requerida; sin embargo, en los lenguajes de bajo nivel es responsabilidad del programador.
Cuando la compatibilidad MS-DOS está activa para los procesadores Intel486 y Pentium y el pin de entrada IGNNE# se activa, la señal FERR# se genera así: 1º, cuando una instrucción FPU causa una excepción FPU no enmascarada, el procesador usa un método "a plazos" para reportar el error, es decir que el procesador no responde inmediatamente (está un tiempo 'congelado'); 2º Cuando se congela, activa la salida FERR#; 3º El procesador congelado espera a una interrupción externa, producida por un hardware en respuesta a la salida FERR#; 4º En sistemas compatibles con MS-DOS, FERR# está conectada a la entrada IRQ13 en la cascada del PIC, y éste genera una interrupción 75H. El método de comunicar el error "a plazos" es usado por todas las excepciones causadas por instrucciones básicas de aritmética, para las demás las guarda en memoria. Sin embargo algunas instrucciones de la FPU con algunas excepciones, usa un método inmediato para comunicar los errores.
Algunas implementaciones hardware han sido menos robustas porque dependían del editor de excepciones para borrar la excepción de petición de interrupción de la FPU en el PIC ANTES de que el editor causara FERR# por no ser confirmado por el borrado de la excepción de la misma FPU.
Si la compatibilidad está activa para procesadores de la familia P6, todo es casi idéntico a lo anterior, salvo que aquí todas las excepciones para todas las instrucciones de FPU causan un error que se comunica inmediatamente; FERR# se activa tan pronto como la FPU detecta un error no enmascarado, no hay esperas. El problema es que puede ser que la interrupción sea servida después de la siguiente instrucción de la secuencia del código, por lo tanto habrá un retraso que depende de la implementación del hardware externo.
Dependiendo de opciones determinadas por el software de diseño de sistemas, el procesador escoge una de dos opciones para actuar en caso de excepción numérica: La 1ª es que selecciona las excepciones por sí mismo produciendo un fix-up por defecto, que en la mayoría de las ocasiones es lo más razonable. Esto permite al programa numérico continuar sin molestias. Cuando detecta una excepción enmascarada, se establece una bandera en el registro numérico de estado pero no se especifica cuándo ocurrió ni dónde fue provocada; En la 2ª un software editor de excepciones puede ser invocado para editarla. Cuando una excepción numérica no está enmascarada y ocurre la excepción, la FPU para la ejecución de las instrucciones numéricas posteriores y provoca una llamada a un software editor de excepciones, que puede implementar cualquier procedimiento de recuperación.
La administración de sincronización requiere un control para las excepciones antes de dejar al procesador que cambie el valor usado por la FPU. Es importante recordar que casi todas las instrucciones numéricas pueden producir excepciones numéricas en determinadas circunstancias. La sincronización de excepciones se refiere a que el editor de excepciones inspecciona y se ocupa de la excepción en el contexto donde se ocurrió. Si la ejecución simultánea está permitida, la reserva del procesador cuando reconoce la excepción a veces no está en el contexto en el que se dio. Pudo haber cambiado sus registros internos y ejecutado un programa completamente diferente en el tiempo en el que ocurrió la excepción. Si el editor de excepciones no puede recapturar el contexto original, no se puede determinar la causa de la excepción ni se puede recuperar completamente de ella. Para resolver este problema, la FPU tiene registros especiales actualizados en el inicio de cada instrucción numérica, para describir la reserva del programa numérico cuando se intenta ejecutar la instrucción que provoca el fallo. Esto proporciona herramientas de ayuda al editor de excepciones para recapturar el contexto original, pero el código de la aplicación debe estar pensado con esta sincronización. Sin embargo, los compiladores de lenguajes de alto nivel ya proporcionan automáticamente toda sincronización requerida; sin embargo, en los lenguajes de bajo nivel es responsabilidad del programador.
miércoles, 26 de noviembre de 2008
Identificación del procesador y detección de características
Cuando se escribe un software previsto para funcionar en varios tipos de procesadores IA, generalmente es necesario identificar el tipo de procesador que lo ejecutará, para saber los elementos disponibles para la aplicación.
La instrucción CPUID retorna el tipo de procesador que la ejecuta. Está disponible sólo en Pentium, Pentium Pro, y los procesadores Intel486. También identifica las posibilidades presentes en el procesador, incluyendo la existencia de un chip FPU. Esta información se puede obtener de esa instrucción: El valor más alto del operando que responde a la instrucción; el número ID de identificación de la familia del procesador, el modelo ID, y el stepping ID; la presencia de un chip FPU; la información TLB y cache; el soporte o presencia de las siguientes extensiones de la arquitectura:
- modos mejorados de virtual-8086
- extensiones para depurar
- extensiones Page-size
- instrucción de lectura de contador time stamp (RDTSC)
- Lee los modelos específicos de registros (RDMSR) y escribe instrucciones de esos modelos (WRMSR)
- extensiones de direccionamiento físico
- excepciones de comprobación de máquina
- compara e intercambia instrucciones de 8 bytes (CMPXCHG8B)
- en chip, controlador avanzado programable de interrupciones (APIC)
- rango de registros de tipo de memoria (MTRR)
- bandera global de page
- control de arquitectura de la máquina
- instrucción de movimiento condicional (CMOVcc)
- tecnología MMX
La instrucción causará la excepción de opcode no válido (#UD) si es ejecutada por un procesador que no la soporte.
La instrucción CPUID retorna el tipo de procesador que la ejecuta. Está disponible sólo en Pentium, Pentium Pro, y los procesadores Intel486. También identifica las posibilidades presentes en el procesador, incluyendo la existencia de un chip FPU. Esta información se puede obtener de esa instrucción: El valor más alto del operando que responde a la instrucción; el número ID de identificación de la familia del procesador, el modelo ID, y el stepping ID; la presencia de un chip FPU; la información TLB y cache; el soporte o presencia de las siguientes extensiones de la arquitectura:
- modos mejorados de virtual-8086
- extensiones para depurar
- extensiones Page-size
- instrucción de lectura de contador time stamp (RDTSC)
- Lee los modelos específicos de registros (RDMSR) y escribe instrucciones de esos modelos (WRMSR)
- extensiones de direccionamiento físico
- excepciones de comprobación de máquina
- compara e intercambia instrucciones de 8 bytes (CMPXCHG8B)
- en chip, controlador avanzado programable de interrupciones (APIC)
- rango de registros de tipo de memoria (MTRR)
- bandera global de page
- control de arquitectura de la máquina
- instrucción de movimiento condicional (CMOVcc)
- tecnología MMX
La instrucción causará la excepción de opcode no válido (#UD) si es ejecutada por un procesador que no la soporte.
Entrada/Salida
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.
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.
lunes, 24 de noviembre de 2008
Programando con las extensiones Streaming SIMD
Las extensiones Streaming SIMD de Intel son un conjunto de extensiones de la IA diseñados para aumentar el rendimiento de las aplicaciones avanzadas de comunicaciones o de multimedia (especialmente adecuadas para la decodificación de MPEG2, gráficas tridimensionales y reconocimiento de voz). Estas extensiones completan la tecnología MMX que ya expliqué.
Las extensiones Streaming SIMD definen un modelo de software simple y flexible. Este nuevo modelo introduce un nuevo estado visible del sistema operativo y para ello se dispone de un nuevo conjunto de registros de 128 bits añadidos. Cualquier software no hace falta que sea modificado para funcionar en un procesador con extensiones Streaming SIMD.
Estas extensiones permiten al programador desarrollar algoritmos que pueden mezclar datos en punto flotante compactados y enteros compactados, con precisión simple, usando las extensiones Streaming SIMD y las instrucciones MMX. Adicionalmente a esas instrucciones, las extensiones Streaming SIMD proporcionan otras nuevas para el control de la cacheability de la tecnología MMX y los tipos de datos de 32 bits. Estas instrucciones nuevas permiten guardar muchos datos en memoria sin tener que contaminar la cache, o también permiten precargar los datos antes de usarlos. Además de las instrucciones también proporciona 8 registros SIMD en punto flotante (de XMM0 a XMM7) a los que se puede direccionar directamente, tipos de datos compactados SIMD de 128 bits en punto flotante, y el conjunto de extensiones Streaming SIMD.
Los nuevos registros requieren soporte del sistema operativo para poder usarlos, y contienen datos compactados de 128 bits. Los registros se pueden usar para mejorar el rendimiento a la hora de calcular sobre los datos, pero no se pueden usar para direccionar a memoria. Para eso están los registros de enteros, los modos estándar de direccionamiento y los registros de propósito general. Los registros MMX están mapeados dentro de los registros de punto flotante. Para hacer la transición de operaciones MMX a operaciones en punto flotante es necesario ejecutar la instrucción EMMS. A partir de que los registros SIMD en punto flotante estén en registros separados, las instrucciones MMX y las de punto flotante se pueden mezclar con las extensiones Streaming SIMD sin excepciones de instrucción especial (como EMMS). Los valores en los registros tienen el mismo formato que una cuantía de 128 bits en memoria, y tienen 2 modos de acceso: modo de acceso de 128 bits y modo de acceso de 32 bits.
El tipo de datos principal de las extensiones Streaming SIMD es un operando compactado, en precisión simple, y en punto flotante. Son 4 doublewords (1 doubleword = 32 bits) compactados en 128 bits. También puede trabajar como 8 words, o como 16 bytes. Los bits de la derecha son los menos significativos. Las extensiones mueven desde y hacia la memoria estos tipos de datos compactados en bloques de 64 o 128 bits.
Las extensiones Streaming SIMD pueden generar 2 tipos de excepciones; no numéricas, y numéricas. Pueden generar los mismos tipos de excepciones de acceso a memoria que las instrucciones IA.
El registro de control/estado es usado para activar excepciones numéricas enmascaradas/desenmascaradas, para establecer modos de redondeo (4 métodos: hacia el más próximo, hacia abajo, hacia arriba, o truncar), para establecer el modo flush-to-zero (activando este modo, los resultados que den cero tendrán el verdadero signo de la operación, y las excepciones de precisión y underflow se activan), y para ver las banderas de estado. Los contenidos de estos registros se pueden guardar en memoria con STMXCSR (guarda el contenido del registro de estado/control SIMD en punto flotante) y FXSAVE (guarda el estado de la FPU y el estado de punto flotante SIMD) y se pueden cargar con las instrucciones LDMXCSR y FXRSTOR.
Las extensiones Streaming SIMD consisten en 70 instrucciones, agrupadas en las siguientes categorías: instrucciones de movimiento de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones adicionales de enteros SIMD, instrucciones Shuffle, instrucciones de manejo de estado, y instrucciones de control de la cacheability.
Las extensiones introducen un nuevo estado en la arquitectura, y no están reñidas con los registros en punto flotante (como lo estaban las instrucciones originales MMX). Las nuevas instrucciones deben de ser usadas para guardar/restablecer el estado de un Pentium III. Se puede programar sin problemas usando a la vez las extensiones y la FPU (una aplicación puede usar la FPU para operaciones con precisión doble o extendida), o las extensiones y la MMX también sin problemas. Pero los problemas siguen si se utiliza a la vez la FPU y la MMX, porque siguen compartiendo los mismos registros.
Las extensiones Streaming SIMD definen un modelo de software simple y flexible. Este nuevo modelo introduce un nuevo estado visible del sistema operativo y para ello se dispone de un nuevo conjunto de registros de 128 bits añadidos. Cualquier software no hace falta que sea modificado para funcionar en un procesador con extensiones Streaming SIMD.
Estas extensiones permiten al programador desarrollar algoritmos que pueden mezclar datos en punto flotante compactados y enteros compactados, con precisión simple, usando las extensiones Streaming SIMD y las instrucciones MMX. Adicionalmente a esas instrucciones, las extensiones Streaming SIMD proporcionan otras nuevas para el control de la cacheability de la tecnología MMX y los tipos de datos de 32 bits. Estas instrucciones nuevas permiten guardar muchos datos en memoria sin tener que contaminar la cache, o también permiten precargar los datos antes de usarlos. Además de las instrucciones también proporciona 8 registros SIMD en punto flotante (de XMM0 a XMM7) a los que se puede direccionar directamente, tipos de datos compactados SIMD de 128 bits en punto flotante, y el conjunto de extensiones Streaming SIMD.
Los nuevos registros requieren soporte del sistema operativo para poder usarlos, y contienen datos compactados de 128 bits. Los registros se pueden usar para mejorar el rendimiento a la hora de calcular sobre los datos, pero no se pueden usar para direccionar a memoria. Para eso están los registros de enteros, los modos estándar de direccionamiento y los registros de propósito general. Los registros MMX están mapeados dentro de los registros de punto flotante. Para hacer la transición de operaciones MMX a operaciones en punto flotante es necesario ejecutar la instrucción EMMS. A partir de que los registros SIMD en punto flotante estén en registros separados, las instrucciones MMX y las de punto flotante se pueden mezclar con las extensiones Streaming SIMD sin excepciones de instrucción especial (como EMMS). Los valores en los registros tienen el mismo formato que una cuantía de 128 bits en memoria, y tienen 2 modos de acceso: modo de acceso de 128 bits y modo de acceso de 32 bits.
El tipo de datos principal de las extensiones Streaming SIMD es un operando compactado, en precisión simple, y en punto flotante. Son 4 doublewords (1 doubleword = 32 bits) compactados en 128 bits. También puede trabajar como 8 words, o como 16 bytes. Los bits de la derecha son los menos significativos. Las extensiones mueven desde y hacia la memoria estos tipos de datos compactados en bloques de 64 o 128 bits.
Las extensiones Streaming SIMD pueden generar 2 tipos de excepciones; no numéricas, y numéricas. Pueden generar los mismos tipos de excepciones de acceso a memoria que las instrucciones IA.
El registro de control/estado es usado para activar excepciones numéricas enmascaradas/desenmascaradas, para establecer modos de redondeo (4 métodos: hacia el más próximo, hacia abajo, hacia arriba, o truncar), para establecer el modo flush-to-zero (activando este modo, los resultados que den cero tendrán el verdadero signo de la operación, y las excepciones de precisión y underflow se activan), y para ver las banderas de estado. Los contenidos de estos registros se pueden guardar en memoria con STMXCSR (guarda el contenido del registro de estado/control SIMD en punto flotante) y FXSAVE (guarda el estado de la FPU y el estado de punto flotante SIMD) y se pueden cargar con las instrucciones LDMXCSR y FXRSTOR.
Las extensiones Streaming SIMD consisten en 70 instrucciones, agrupadas en las siguientes categorías: instrucciones de movimiento de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones adicionales de enteros SIMD, instrucciones Shuffle, instrucciones de manejo de estado, y instrucciones de control de la cacheability.
Las extensiones introducen un nuevo estado en la arquitectura, y no están reñidas con los registros en punto flotante (como lo estaban las instrucciones originales MMX). Las nuevas instrucciones deben de ser usadas para guardar/restablecer el estado de un Pentium III. Se puede programar sin problemas usando a la vez las extensiones y la FPU (una aplicación puede usar la FPU para operaciones con precisión doble o extendida), o las extensiones y la MMX también sin problemas. Pero los problemas siguen si se utiliza a la vez la FPU y la MMX, porque siguen compartiendo los mismos registros.
sábado, 22 de noviembre de 2008
Programando con la tecnología MMX de Intel
La tecnología MMX de Intel se compone de un conjunto de extensiones para la IA diseñados para mejorar muchísimo el rendimiento de las aplicaciones avanzadas multimedia y de comunicaciones. Estas extensiones se combinan con una instrucción única para múltiples datos (SIMD) para acelerar el rendimiento de las aplicaciones como procesado de imagen, síntesis de audio, videoconferencias, etc, usarán a menudo algoritmos intensivos de computación para ejecutar operaciones repetidas en elementos de datos nativos. Los repertorios SIMD consisten en instrucciones que aplican una misma operación sobre un conjunto más o menos grande de datos. Es una organización que influye muchas unidades de procesamiento bajo la supervisión de una unidad de control común. Es decir, una única unidad de control despacha las instrucciones a diferentes unidades de procesamiento. Todos los procesadores reciben la misma instrucción de la unidad de control, pero operan sobre diferentes conjuntos de datos. O sea que la misma instrucción es ejecutada de manera síncrona por todas las unidades de procesamiento.
La tecnología MMX define un software muy simple y flexible, sin ningún modo nuevo ni ningún estado visible del sistema operativo nuevo. Todo el software que existía podrá ser ejecutado sin problemas.
Incorpora estas extensiones al entorno de programación del IA: 8 registros MMX (de MM0 a MM7), 4 tipos de datos MMX (bytes compactados, words compactados, doublewords compactados, y quadwords), y el conjunto de instrucciones de MMX.
Los registros MMX consisten en 8 registros de 64 bits cada uno, que son operados directamente mediante el conjunto de instrucciones MMX. Estos registros sólo se pueden usar para ejecutar cálculos en tipos de datos MMX; no se pueden usar para direccionar a memoria. Para eso están los modos estándar de acceso a memoria del IA y los registros de propósito general.
El modelo SIMD de ejecución soporta en la tecnología MMX direccionamiento directo, y mejora las necesidades de las aplicaciones de comunicaciones, de gráficos, etc que usan sofisticados algoritmos, ejecutando las mismas operaciones muchos números de tipos de datos pequeños. Por ejemplo, el vídeo y la información gráfica normalmente se representan en cuantías de 1 byte (8 bits) en paralelo. Aquí, una instrucción MMX puede operar en 8 de estos bytes simultáneamente.
Los bytes compactados son enumerados del 0 al 7, con el byte 0 conteniendo los bits menos significativos del tipo de datos. Los words compactados son enumerados del 0 al 4, con el word 0 conteniedo los bits 0 hasta el 15, y el word 4 conteniendo los bits 48 hasta 63. Los doublewords compactados son enumerados del 0 al 1, con el doubleword 0 conteniendo los bits del 0 al 31, y con el doubleword 1 conteniendo los bits del 32 al 63. Las instrucciones MMX mueven desde y hacia la memoria y a los registros de propósito general en bloques de 64 bits los tipos de datos compactados y los quadwords. Cuando se ejecutan operaciones aritméticas o lógicas sobre estos tipos de datos, las instrucciones MMX operan en paralelo a los bytes individuales, words o doublewords contenidos en los registros MMX de 64 bits.
Cuando se guardan en memoria los bytes, words, doublewords en los tipos de datos compactados se almacenan en direcciones consecutivas, con el dato menos significativo en la dirección mas baja.
Los valores en los registros MMX tienen el mismo formato que una cuantía de 64 bits en memoria, y tienen dos modos de acceso a los datos; modo de acceso de 64 bits (se usa por ejemplo, para acceder a memoria de 64 bits o instrucciones lógicas y aritméticas), y modo de acceso de 32 bits (se usa por ejemplo, para acceder a memoria de 32 bits, y algunas instrucciones no compactadas).
El conjunto de instrucciones del MMX consiste en 57 instrucciones (que no voy a detallar) que se pueden agrupar en estas categorías: instrucciones de transferencia de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones Shift, y instrucciones de estado de vacío de MMX.
La tecnología MMX usa las mismas técnicas de interfaz entre la arquitectura en punto flotante y el sistema operativo. Usa los mismos registros que la FPU, los reutiliza. No se debe mezclar código MMX con código en punto flotante en el nivel de instrucción por varias razones: El valor tope de la pila del estado de un word en punto flotante, se pone a cero después de la instrucción MMX, y el puntero del código en punto flotante se pierde; una instrucción MMX cuando escribe en un registro MMX, escribe unos (11s) en la parte del exponente del correspondiente registro en punto flotante; el código en punto flotante que usa contenidos de registro generados por instrucciones MMX pueden causar excepciones en punto flotante o resultados incorrectos; Excepto EMMS, el resto de instrucciones MMX ponen la tag word a un estado válido, sin guardar el estado anterior en punto flotante; las transiciones frecuentes entre instrucciones MMX y en punto flotante puede afectar negativamente al rendimiento en algunas implementaciones porque son muy lentas, por lo tanto lo óptimo es que el programador utilice el procesador de un modo u otro, aunque si no es posible es recomendable seguir estas directrices: Particionar el módulo de tecnología MMX y el módulo en punto flotante, en conjuntos separados de instrucciones (subrutinas o bucles separados) de forma que sólo contengan instrucciones de un tipo; No contar con los contenidos de los registros durante las transiciones; Cuando el estado MMX no se requiere, vaciarlo usando la instrucción EMMS; Salir de la sección de código en punto flotante con la pila vacía.
La MMX tiene otro problema añadido, y es que sólo soporta operaciones con números enteros. Intel solucionó esos problemas más adelante con las extensiones Streaming SIMD, que da soporte para operaciones en punto flotante de 32 bits y un sistema adicional de registros de 128 bits que facilita el uso de SIMD y la FPU a la vez.
La tecnología MMX define un software muy simple y flexible, sin ningún modo nuevo ni ningún estado visible del sistema operativo nuevo. Todo el software que existía podrá ser ejecutado sin problemas.
Incorpora estas extensiones al entorno de programación del IA: 8 registros MMX (de MM0 a MM7), 4 tipos de datos MMX (bytes compactados, words compactados, doublewords compactados, y quadwords), y el conjunto de instrucciones de MMX.
Los registros MMX consisten en 8 registros de 64 bits cada uno, que son operados directamente mediante el conjunto de instrucciones MMX. Estos registros sólo se pueden usar para ejecutar cálculos en tipos de datos MMX; no se pueden usar para direccionar a memoria. Para eso están los modos estándar de acceso a memoria del IA y los registros de propósito general.
El modelo SIMD de ejecución soporta en la tecnología MMX direccionamiento directo, y mejora las necesidades de las aplicaciones de comunicaciones, de gráficos, etc que usan sofisticados algoritmos, ejecutando las mismas operaciones muchos números de tipos de datos pequeños. Por ejemplo, el vídeo y la información gráfica normalmente se representan en cuantías de 1 byte (8 bits) en paralelo. Aquí, una instrucción MMX puede operar en 8 de estos bytes simultáneamente.
Los bytes compactados son enumerados del 0 al 7, con el byte 0 conteniendo los bits menos significativos del tipo de datos. Los words compactados son enumerados del 0 al 4, con el word 0 conteniedo los bits 0 hasta el 15, y el word 4 conteniendo los bits 48 hasta 63. Los doublewords compactados son enumerados del 0 al 1, con el doubleword 0 conteniendo los bits del 0 al 31, y con el doubleword 1 conteniendo los bits del 32 al 63. Las instrucciones MMX mueven desde y hacia la memoria y a los registros de propósito general en bloques de 64 bits los tipos de datos compactados y los quadwords. Cuando se ejecutan operaciones aritméticas o lógicas sobre estos tipos de datos, las instrucciones MMX operan en paralelo a los bytes individuales, words o doublewords contenidos en los registros MMX de 64 bits.
Cuando se guardan en memoria los bytes, words, doublewords en los tipos de datos compactados se almacenan en direcciones consecutivas, con el dato menos significativo en la dirección mas baja.
Los valores en los registros MMX tienen el mismo formato que una cuantía de 64 bits en memoria, y tienen dos modos de acceso a los datos; modo de acceso de 64 bits (se usa por ejemplo, para acceder a memoria de 64 bits o instrucciones lógicas y aritméticas), y modo de acceso de 32 bits (se usa por ejemplo, para acceder a memoria de 32 bits, y algunas instrucciones no compactadas).
El conjunto de instrucciones del MMX consiste en 57 instrucciones (que no voy a detallar) que se pueden agrupar en estas categorías: instrucciones de transferencia de datos, instrucciones aritméticas, instrucciones de comparación, instrucciones de conversión, instrucciones lógicas, instrucciones Shift, y instrucciones de estado de vacío de MMX.
La tecnología MMX usa las mismas técnicas de interfaz entre la arquitectura en punto flotante y el sistema operativo. Usa los mismos registros que la FPU, los reutiliza. No se debe mezclar código MMX con código en punto flotante en el nivel de instrucción por varias razones: El valor tope de la pila del estado de un word en punto flotante, se pone a cero después de la instrucción MMX, y el puntero del código en punto flotante se pierde; una instrucción MMX cuando escribe en un registro MMX, escribe unos (11s) en la parte del exponente del correspondiente registro en punto flotante; el código en punto flotante que usa contenidos de registro generados por instrucciones MMX pueden causar excepciones en punto flotante o resultados incorrectos; Excepto EMMS, el resto de instrucciones MMX ponen la tag word a un estado válido, sin guardar el estado anterior en punto flotante; las transiciones frecuentes entre instrucciones MMX y en punto flotante puede afectar negativamente al rendimiento en algunas implementaciones porque son muy lentas, por lo tanto lo óptimo es que el programador utilice el procesador de un modo u otro, aunque si no es posible es recomendable seguir estas directrices: Particionar el módulo de tecnología MMX y el módulo en punto flotante, en conjuntos separados de instrucciones (subrutinas o bucles separados) de forma que sólo contengan instrucciones de un tipo; No contar con los contenidos de los registros durante las transiciones; Cuando el estado MMX no se requiere, vaciarlo usando la instrucción EMMS; Salir de la sección de código en punto flotante con la pila vacía.
La MMX tiene otro problema añadido, y es que sólo soporta operaciones con números enteros. Intel solucionó esos problemas más adelante con las extensiones Streaming SIMD, que da soporte para operaciones en punto flotante de 32 bits y un sistema adicional de registros de 128 bits que facilita el uso de SIMD y la FPU a la vez.
viernes, 21 de noviembre de 2008
Unidad en punto flotante
La Unidad de punto flotante (a partir de ahora FPU) de la IA proporciona un alto rendimiento a la capacidad de procesar en punto flotante. Soporta tipos de datos reales, enteros, y enteros BCD, el algoritmo de procesamiento en punto flotante y excepciones de manejo de arquitectura definido en IEEE 754 y 854 Standards for Floating-Point Arithmetic. La FPU ejecuta instrucciones desde el conjunto normal de instrucciones del procesador y implementa la eficiencia de los procesadores IA a favor de la precisión numérica necesaria para cálculos científicos, por ejemplo.
Para aumentar la velocidad y eficiencia de las operaciones con números reales, se representan en un formato binario de punto flotante. En el formato, el número real tiene 3 partes: el signo (1 bit; 0 si es positivo, 1 si es negativo), el exponente (8 bits, que representa el orden de magnitud de la mantisa. El mínimo y el máximo valor posible determinan el rango de valores representables.), y la parte fraccionaria de la mantisa (23 bits, que representa los dígitos significativos del número. El tamaño máximo determina la precisión de la representación. Normalmente este campo está normalizado, es decir que su parte entera sólo consta de un dígito). Esta forma es conforme al estándar IEEE, y se llama representación de números reales en simple precisión.
Una variante de números reales y valores especiales se puede codificar en el formato de punto flotante de la FPU. Estos valores especiales se dividen en: Ceros con signo (El cero se puede representar como +0 o -0, siendo el valor de ambos el mismo. Esto sirve por ejemplo, para indicar el signo de un infinito que ha sido anulado), números finitos no normalizados (Cuando un número es muy próximo a cero no se puede utilizar el formato normalizado porque el rango del exponente es demasiado largo. Para esto se usa el formato no normalizado, poniendo los bits de la mantisa a cero para que el exponente no sea tan grande. Esto implica pérdida de precisión), números finitos normalizados (Son todos los números finitos distintos de cero que pueden ser codificados en un formato de números reales normalizado entre cero y infinito), infinitos con signo (Para representar el infinito la mantisa debe estar a cero, y el exponente al valor máximo permitido por el formato que se utiliza), NaNs (de Not A Number; los signos para los NaNs son ignorados, y aquí se incluyen los números con máximo exponente y mantisa no nula. Hay dos tipos: QNaNs, que son NaNs con el bit más significativo de la mantisa a 1 y se les permiten propagarse por la mayoría de las operaciones aritméticas sin que salte una excepción; y SNaNs, que el bit de la mantisa es 0 y generalmente son señal de una excepción en una operación no válida. Es posible operar con NaNs), y números indefinidos (Operando con números reales, el valor real indefinido es un QNaN).
La FPU es un coprocesador que opera paralelamente con la Integer Unit del procesador. La FPU toma las instrucciones del mismo decodificador de instrucciones y secuanciador que la Integer Unit, y comparte el bus del sistema con ella. A pesar de todo, operan independientemente y en paralelo. El entorno de ejecución de instrucciones de la FPU consiste en 8 registros de datos y 6 registros de propósito general (el registro de estado (registro de 16 bits que controla el tope de la pila, las condiciones de las banderas del código, las banderas de excepciones o la bandera de fallo de pila), el de control (registro de 16 bits que controla el método de redondeo (al más cercano, al mayor, al menor, o truncar) y la precisión que puede ser de 24, 53 o 64 bits. También contiene los bits de la máscara de la bandera de excepciones), el registro tag word (indica el contenido de los 8 registros en la pila de registros de datos del FPU), el de puntero de instrucción (El contenido está indefinido si la instrucción previa que no sea de control no tuvo un operador de memoria), el de último operando, y el de opcode(proporciona información de estado para el administrar excepciones)).
Las instrucciones FSTENV/FNSTENV guardan el contenido de estado, control, punteros de instrucción y de operación de la FPU, y registros de opcode. Las instrucciones FSAVE/FNSAVE guardan esa información y el contenido de los registros de datos, y inicializa la FPU a los valores por defecto. La forma en que se establece la información en memoria depende del modo de operación del procesador (modo protegido o modo real-address).
La FPU trabaja con 7 tipos de datos, divididos en 3 grupos: reales, enteros, y enteros BCD compactados. Con la excepción del bit 80 del formato real extendido, el resto de tipos de datos existen sólo en memoria. Cuando son cargados en registros de datos de la FPU, se convierten en formato real extendido y operan en dicho formato. Los 3 tipos de datos reales (single-real, double-real, extended-real) se corresponden directamente a los formatos single-precision, double-precision y double-extended-precision del estándar del IEEE. Los tipos de datos enteros binarios también son 3: word, short y long. El formato es el mismo para los 3, lo que cambia es la longitud. Los negativos se representan en complemento a 2 (invertir el valor de cada cifra, y sumarle uno).
Hay formatos no soportados por el formato real extendido, como por ejemplo pseudo-NaNs o números pseudo-infinitos. Se generan excepciones de operación no válida cuando se detecta este tipo de datos.
Los SNaNs se usan por ejemplo, para que el programador sepa quien ha hecho saltar una excepción cuando se desenmascara la excepción de operación inválida.Los QNaNs se pueden utilizar por ejemplo, para depurar más rápidamente un código.
La FPU detecta seis clases de condiciones de excepción mientras se ejecutan instrucciones en punto flotante: Operaciones no válidas (overflow de pila, underflow, operación aritmética no válida), división por cero, operando no normalizado, overflow numérico, underflow numérico, y resultado no exacto. Cada una tiene su bandera correspondiente asignada al registro de estado y en la máscara del registro de control de la FPU. Las excepciones más significativas son (en orden de prioridad, de más a menos significativas): excepción de operación no válida (overflow o underflow de pila, operando de formato no soportado, operando SNaN), operando QNaN (no es una excepción, pero tiene prioridad sobre excepciones menos significativas), cualquier otra excepción de operación no válida no mencionada o la excepción de división por cero, excepción de operando no normal, excepción de overflow y underflow numérico en conjunto con la de resultado no exacto, excepción de resultado no exacto.
La FPU del Pentium Pro, Pentium y Intel486 proporciona dos modos diferentes de operacion para invocar una excepción del software para excepciones en punto flotante; modo nativo, y modo compatible con MS-DOS.
Como la Integer Unit y la FPU son unidades separadas de ejecución, es posible ejecutar instrucciones en punto flotante, de enteros, y del sistema a la vez. Sin embargo, esta ejecución puede causar problemas para las excepciones en punto flotante. Estos se solucionan poniendo inmediatamente después de una instrucción en punto flotante que pueda dar lugar a esta situación, una excepción de instrucción sincronizada.
Para aumentar la velocidad y eficiencia de las operaciones con números reales, se representan en un formato binario de punto flotante. En el formato, el número real tiene 3 partes: el signo (1 bit; 0 si es positivo, 1 si es negativo), el exponente (8 bits, que representa el orden de magnitud de la mantisa. El mínimo y el máximo valor posible determinan el rango de valores representables.), y la parte fraccionaria de la mantisa (23 bits, que representa los dígitos significativos del número. El tamaño máximo determina la precisión de la representación. Normalmente este campo está normalizado, es decir que su parte entera sólo consta de un dígito). Esta forma es conforme al estándar IEEE, y se llama representación de números reales en simple precisión.
Una variante de números reales y valores especiales se puede codificar en el formato de punto flotante de la FPU. Estos valores especiales se dividen en: Ceros con signo (El cero se puede representar como +0 o -0, siendo el valor de ambos el mismo. Esto sirve por ejemplo, para indicar el signo de un infinito que ha sido anulado), números finitos no normalizados (Cuando un número es muy próximo a cero no se puede utilizar el formato normalizado porque el rango del exponente es demasiado largo. Para esto se usa el formato no normalizado, poniendo los bits de la mantisa a cero para que el exponente no sea tan grande. Esto implica pérdida de precisión), números finitos normalizados (Son todos los números finitos distintos de cero que pueden ser codificados en un formato de números reales normalizado entre cero y infinito), infinitos con signo (Para representar el infinito la mantisa debe estar a cero, y el exponente al valor máximo permitido por el formato que se utiliza), NaNs (de Not A Number; los signos para los NaNs son ignorados, y aquí se incluyen los números con máximo exponente y mantisa no nula. Hay dos tipos: QNaNs, que son NaNs con el bit más significativo de la mantisa a 1 y se les permiten propagarse por la mayoría de las operaciones aritméticas sin que salte una excepción; y SNaNs, que el bit de la mantisa es 0 y generalmente son señal de una excepción en una operación no válida. Es posible operar con NaNs), y números indefinidos (Operando con números reales, el valor real indefinido es un QNaN).
La FPU es un coprocesador que opera paralelamente con la Integer Unit del procesador. La FPU toma las instrucciones del mismo decodificador de instrucciones y secuanciador que la Integer Unit, y comparte el bus del sistema con ella. A pesar de todo, operan independientemente y en paralelo. El entorno de ejecución de instrucciones de la FPU consiste en 8 registros de datos y 6 registros de propósito general (el registro de estado (registro de 16 bits que controla el tope de la pila, las condiciones de las banderas del código, las banderas de excepciones o la bandera de fallo de pila), el de control (registro de 16 bits que controla el método de redondeo (al más cercano, al mayor, al menor, o truncar) y la precisión que puede ser de 24, 53 o 64 bits. También contiene los bits de la máscara de la bandera de excepciones), el registro tag word (indica el contenido de los 8 registros en la pila de registros de datos del FPU), el de puntero de instrucción (El contenido está indefinido si la instrucción previa que no sea de control no tuvo un operador de memoria), el de último operando, y el de opcode(proporciona información de estado para el administrar excepciones)).
Las instrucciones FSTENV/FNSTENV guardan el contenido de estado, control, punteros de instrucción y de operación de la FPU, y registros de opcode. Las instrucciones FSAVE/FNSAVE guardan esa información y el contenido de los registros de datos, y inicializa la FPU a los valores por defecto. La forma en que se establece la información en memoria depende del modo de operación del procesador (modo protegido o modo real-address).
La FPU trabaja con 7 tipos de datos, divididos en 3 grupos: reales, enteros, y enteros BCD compactados. Con la excepción del bit 80 del formato real extendido, el resto de tipos de datos existen sólo en memoria. Cuando son cargados en registros de datos de la FPU, se convierten en formato real extendido y operan en dicho formato. Los 3 tipos de datos reales (single-real, double-real, extended-real) se corresponden directamente a los formatos single-precision, double-precision y double-extended-precision del estándar del IEEE. Los tipos de datos enteros binarios también son 3: word, short y long. El formato es el mismo para los 3, lo que cambia es la longitud. Los negativos se representan en complemento a 2 (invertir el valor de cada cifra, y sumarle uno).
Hay formatos no soportados por el formato real extendido, como por ejemplo pseudo-NaNs o números pseudo-infinitos. Se generan excepciones de operación no válida cuando se detecta este tipo de datos.
Los SNaNs se usan por ejemplo, para que el programador sepa quien ha hecho saltar una excepción cuando se desenmascara la excepción de operación inválida.Los QNaNs se pueden utilizar por ejemplo, para depurar más rápidamente un código.
La FPU detecta seis clases de condiciones de excepción mientras se ejecutan instrucciones en punto flotante: Operaciones no válidas (overflow de pila, underflow, operación aritmética no válida), división por cero, operando no normalizado, overflow numérico, underflow numérico, y resultado no exacto. Cada una tiene su bandera correspondiente asignada al registro de estado y en la máscara del registro de control de la FPU. Las excepciones más significativas son (en orden de prioridad, de más a menos significativas): excepción de operación no válida (overflow o underflow de pila, operando de formato no soportado, operando SNaN), operando QNaN (no es una excepción, pero tiene prioridad sobre excepciones menos significativas), cualquier otra excepción de operación no válida no mencionada o la excepción de división por cero, excepción de operando no normal, excepción de overflow y underflow numérico en conjunto con la de resultado no exacto, excepción de resultado no exacto.
La FPU del Pentium Pro, Pentium y Intel486 proporciona dos modos diferentes de operacion para invocar una excepción del software para excepciones en punto flotante; modo nativo, y modo compatible con MS-DOS.
Como la Integer Unit y la FPU son unidades separadas de ejecución, es posible ejecutar instrucciones en punto flotante, de enteros, y del sistema a la vez. Sin embargo, esta ejecución puede causar problemas para las excepciones en punto flotante. Estos se solucionan poniendo inmediatamente después de una instrucción en punto flotante que pueda dar lugar a esta situación, una excepción de instrucción sincronizada.
Tipos de datos y modos de direccionamiento
Los tipos de datos en IA son bytes (8 bits), words (2 bytes o 16 bits), doublewords (4 bytes o 32 bits), y quadwords (8 bytes o 64 bits). Los principales son los tres primeros. El Pentium III introduce otro tipo de datos más largo de 128 bits, compactando números en punto flotante de precisión única (32 bits).
En los tipos word, doubleword, y quadword no es necesario que estén alineados en memoria en límites naturales (los límites para el tipo word son las direcciones pares, para el tipo doubleword son las divisibles por 4, y para el tipo quadword las divisibles por 8). Sin embargo, para mejorar el rendimiento de los programas las estructuras de datos (sobre todo las pilas) tienen que estar alineados a sus límites naturales cuando sea posible. Esto se debe a que si se sobrepasan los límites el procesador lo considera no alineado y requiere dos ciclos de bus de memoria para acceder a los datos (si estuvieran alineados, requeriría uno). Cuando se accede a datos de 128 bits del Pentium III, esos datos tienen que asignarse a límites de 16 bytes. Hay instrucciones que permiten el acceso si no están alineados, pero requiere tiempo extra para recibir los datos en el cache. Si se utiliza una instrucción que espera datos alineados y no lo están, ocurrirá una falta de protección general.
Algunas instrucciones soportan interpretaciones adicionales de estos tipos de datos para permitir operaciones sobre datos numéricos (enteros con o sin signo y enteros BCD).
Los enteros son números binarios con signo que ocupan un byte, un word o un doubleword. Todas las operaciones asumen dos representaciones complementarias. El signo es el bit que está más a la izquierda, y toma el valor 0 cuando el número es positivo o cero, y 1 cuando es negativo. Los rangos son: para un byte entero, de -128 a 127; para un word entero, de -32768 a 32767; y para un doubleword entero, de -2^(31) a 2^(31)-1.
También hay enteros sin signo (o ordinales), todos positivos. Los rangos son: para un byte de ordinales, de 0 a 255; para un word, de 0 a 65535; para un doubleword, de 0 a 2^(32)-1.
Los enteros BCD (Binary-Coded Decimal integers, o enteros decimales codificados en binario) son enteros de 4 bits sin signo con valores entre 0 y 9. Pueden ser no compactados (un dígito BCD por byte) o compactados (dos dígitos BCD por byte). El valor de un BCD no compactado es el valor binario de la mitad más baja del byte (bits del 0 al 3). El valor de la mitad más alta es indiferente, excepto en operaciones de multiplicación y división que deben ser cero. Un BCD compactado son dos números en un byte; en este caso el número de la mitad más alta (del 4 al 7 bit) es el más significativo. Por "compactado" se entiende que por ejemplo, en vez de usar un registro de 64 bits para guardar un dato de 64 bits (un quadword), se puede usar para guardar 2 datos de 32 bits (un doubleword), 4 datos de 16 bits (un word), o 8 datos de 8 bits (un byte). Es un concepto muy importante para la tecnología MMX.
Los punteros son localizaciones de las direcciones en memoria. El procesador reconoce dos tipos; el puntero para direcciones cercanas (32 bits) y el puntero para direcciones lejanas (48 bits). El primero actúa sobre un segmento de la memoria, y el segundo es una dirección lógica de 48 bits que consiste en 16 bits para el selector de segmentos, y de 32 bits para la dirección.
Los campos de bits son secuencias contiguas de bits. Pueden empezar en cualquier bit de cualquier byte de la memoria, y ocupar más de 32 bits.
Las instrucciones de punto flotante reconocen un conjunto de números reales, enteros y enteros BCD que explicaré en otro capítulo más adelante.
Algunas instrucciones usan datos codificados en ella como propios operandos. Estos operandos se llaman operandos inmediatos. Por ejemplo, en esta instrucción -> ADD EAX, 14 añade el operando inmediato 14, al contenido del registro EAX. Excepto DIV y IDIV, todas las operaciones aritméticas permiten el uso de operandos inmediatos.
Los datos también pueden estar contenidos en registros, dependiendo de la instrucción a ejecutar; las operaciones DIV o MUL usan operandos quadword en un par de registros de 32 bits cada uno. No registros cualquiera, porque el procesador tiene unos determinados para controlar la administración de memoria, las interrupciones y excepciones, etc.
Los operandos fuente y destino en memoria son referenciados por el selector de segmento y un offset. El primero especifica el segmento que contiene el operando, y el offset especifica la dirección efectiva del mismo. El selector de segmento puede especificarse implicita o explicitamente. La forma más común es cargarlo en un registro de segmento y permitir al procesador que lo seleccione implícitamente dependiendo del tipo de operación a ejecutar. El procesador automáticamente lo selecciona de acuerdo con unas reglas.La parte offset se puede especificar directamente como un valor estático (llamado desplazamiento) o a través de una dirección computada, creada a partir de uno o más de los siguientes componentes: Desplazamiento (un valor de 8, 16 o 32 bits), Base (un valor en un registro de proposito general), Index (un valor en otro registro de proposito general) y factor de escala (un valor de 2, 4 o 8 que se multiplica al valor de Index). La salida final se llama dirección efectiva.
El procesador soporta un espacio de direcciones de E/S (entrada/salida) que contiene más de 65536 puertos E/S de 8 bits. Estos puertos son de 16 o de 32 bits y serán definidos en el espacio de direcciones de E/S. El direccionamiento a estos puertos lo explicaré más adelante.
En los tipos word, doubleword, y quadword no es necesario que estén alineados en memoria en límites naturales (los límites para el tipo word son las direcciones pares, para el tipo doubleword son las divisibles por 4, y para el tipo quadword las divisibles por 8). Sin embargo, para mejorar el rendimiento de los programas las estructuras de datos (sobre todo las pilas) tienen que estar alineados a sus límites naturales cuando sea posible. Esto se debe a que si se sobrepasan los límites el procesador lo considera no alineado y requiere dos ciclos de bus de memoria para acceder a los datos (si estuvieran alineados, requeriría uno). Cuando se accede a datos de 128 bits del Pentium III, esos datos tienen que asignarse a límites de 16 bytes. Hay instrucciones que permiten el acceso si no están alineados, pero requiere tiempo extra para recibir los datos en el cache. Si se utiliza una instrucción que espera datos alineados y no lo están, ocurrirá una falta de protección general.
Algunas instrucciones soportan interpretaciones adicionales de estos tipos de datos para permitir operaciones sobre datos numéricos (enteros con o sin signo y enteros BCD).
Los enteros son números binarios con signo que ocupan un byte, un word o un doubleword. Todas las operaciones asumen dos representaciones complementarias. El signo es el bit que está más a la izquierda, y toma el valor 0 cuando el número es positivo o cero, y 1 cuando es negativo. Los rangos son: para un byte entero, de -128 a 127; para un word entero, de -32768 a 32767; y para un doubleword entero, de -2^(31) a 2^(31)-1.
También hay enteros sin signo (o ordinales), todos positivos. Los rangos son: para un byte de ordinales, de 0 a 255; para un word, de 0 a 65535; para un doubleword, de 0 a 2^(32)-1.
Los enteros BCD (Binary-Coded Decimal integers, o enteros decimales codificados en binario) son enteros de 4 bits sin signo con valores entre 0 y 9. Pueden ser no compactados (un dígito BCD por byte) o compactados (dos dígitos BCD por byte). El valor de un BCD no compactado es el valor binario de la mitad más baja del byte (bits del 0 al 3). El valor de la mitad más alta es indiferente, excepto en operaciones de multiplicación y división que deben ser cero. Un BCD compactado son dos números en un byte; en este caso el número de la mitad más alta (del 4 al 7 bit) es el más significativo. Por "compactado" se entiende que por ejemplo, en vez de usar un registro de 64 bits para guardar un dato de 64 bits (un quadword), se puede usar para guardar 2 datos de 32 bits (un doubleword), 4 datos de 16 bits (un word), o 8 datos de 8 bits (un byte). Es un concepto muy importante para la tecnología MMX.
Los punteros son localizaciones de las direcciones en memoria. El procesador reconoce dos tipos; el puntero para direcciones cercanas (32 bits) y el puntero para direcciones lejanas (48 bits). El primero actúa sobre un segmento de la memoria, y el segundo es una dirección lógica de 48 bits que consiste en 16 bits para el selector de segmentos, y de 32 bits para la dirección.
Los campos de bits son secuencias contiguas de bits. Pueden empezar en cualquier bit de cualquier byte de la memoria, y ocupar más de 32 bits.
Las instrucciones de punto flotante reconocen un conjunto de números reales, enteros y enteros BCD que explicaré en otro capítulo más adelante.
Algunas instrucciones usan datos codificados en ella como propios operandos. Estos operandos se llaman operandos inmediatos. Por ejemplo, en esta instrucción -> ADD EAX, 14 añade el operando inmediato 14, al contenido del registro EAX. Excepto DIV y IDIV, todas las operaciones aritméticas permiten el uso de operandos inmediatos.
Los datos también pueden estar contenidos en registros, dependiendo de la instrucción a ejecutar; las operaciones DIV o MUL usan operandos quadword en un par de registros de 32 bits cada uno. No registros cualquiera, porque el procesador tiene unos determinados para controlar la administración de memoria, las interrupciones y excepciones, etc.
Los operandos fuente y destino en memoria son referenciados por el selector de segmento y un offset. El primero especifica el segmento que contiene el operando, y el offset especifica la dirección efectiva del mismo. El selector de segmento puede especificarse implicita o explicitamente. La forma más común es cargarlo en un registro de segmento y permitir al procesador que lo seleccione implícitamente dependiendo del tipo de operación a ejecutar. El procesador automáticamente lo selecciona de acuerdo con unas reglas.La parte offset se puede especificar directamente como un valor estático (llamado desplazamiento) o a través de una dirección computada, creada a partir de uno o más de los siguientes componentes: Desplazamiento (un valor de 8, 16 o 32 bits), Base (un valor en un registro de proposito general), Index (un valor en otro registro de proposito general) y factor de escala (un valor de 2, 4 o 8 que se multiplica al valor de Index). La salida final se llama dirección efectiva.
El procesador soporta un espacio de direcciones de E/S (entrada/salida) que contiene más de 65536 puertos E/S de 8 bits. Estos puertos son de 16 o de 32 bits y serán definidos en el espacio de direcciones de E/S. El direccionamiento a estos puertos lo explicaré más adelante.
jueves, 20 de noviembre de 2008
LLamadas a procedimientos, interrupciones, y excepciones
El procesador soporta dos maneras de llamar a procedimientos: las instrucciones CALL y RET, y las instrucciones ENTER y LEAVE (éstas en conjunto con las anteriores).
La pila es un array de posiciones de memoria contiguas; una memoria LIFO (Last In, First Out: cuando se meten datos en la pila, se sacan en orden inverso). Las instrucciones para el manejo de la pila son PUSH para meter items, y POP para sacarlos. Un programa o un sistema operativo puede necesitar muchas pilas, pero está limitado por el número máximo de segmentos y de memoria física disponible. Cuando un sistema posee más de una pila sólo está disponible una (la única contenida en el segmento referido al registro SS), no puede manejar más a la vez.
La instrucción CALL permite llamar fácilmente a procedimientos. Guarda la dirección de la instrucción que se está ejecutando en la pila (con PUSH) para después poder recuperarla y seguir donde estaba, y salta con una instrucción de salto. La instrucción RET hace lo inverso; recupera la posición guardada en la pila (mediante POP) y salta a ella (a la posición de memoria) para seguir con lo que se estaba haciendo antes del procedimiento.
Los parámetros pueden ser pasados entre los procedimientos de tres formas: mediante registros de propósito general (guardando los datos en registros antes de ejecutar CALL), en una lista de argumentos (es un método para pasar un número largo de parámetros, que consiste en guardarlos en una lista de argumentos en uno de los segmentos de datos en memoria; entonces al procedimiento se le pasará un puntero apuntando a esa lista), o mediante la pila.
Existe un mecanismo de protección en la IA que reconoce cuatro nieveles de privilegios (enumerados del 0 al 3, siendo el 0 los de un privilegio mayor). La razón de este mecanismo es aumentar la fiabilidad del sistema operativo. Si ocurren dos interrupciones a la vez, se atenderá primero a la que tenga más privilegios y la otra deberá esperar.
La diferencia entre interrupciones y excepciones es que las interrupciones son asíncronas (pueden ocurrir en cualquier momento, normalmente producido por un dispositivo E/S), y las excepciones son síncronas (las genera el procesador cuando detecta unas condiciones anteriormente predefinidas; se pueden prever). El procesador responde a ambos casos de manera similar, para lo que está haciendo (en el programa principal) y salta a un procedimiento (o subrutina) programado para esa interrupcion o excepción, lo ejecuta y vuelve a saltar donde lo dejó en el programa principal.
La IA soporta un método alternativo para producir llamadas a procedimientos, llamando desde las instrucciones ENTRE y LEAVE. Estas instrucciones crean automáticamente frames de pila para llamar a los procedimientos. Esto tiene dos ventajas: Proporciona soporte de lenguaje máquina para implementar lenguajes estructurados en bloques, como C o Pascal; y simplifica las entradas y salidas de los procedimientos en código generado por el compilador.
La pila es un array de posiciones de memoria contiguas; una memoria LIFO (Last In, First Out: cuando se meten datos en la pila, se sacan en orden inverso). Las instrucciones para el manejo de la pila son PUSH para meter items, y POP para sacarlos. Un programa o un sistema operativo puede necesitar muchas pilas, pero está limitado por el número máximo de segmentos y de memoria física disponible. Cuando un sistema posee más de una pila sólo está disponible una (la única contenida en el segmento referido al registro SS), no puede manejar más a la vez.
La instrucción CALL permite llamar fácilmente a procedimientos. Guarda la dirección de la instrucción que se está ejecutando en la pila (con PUSH) para después poder recuperarla y seguir donde estaba, y salta con una instrucción de salto. La instrucción RET hace lo inverso; recupera la posición guardada en la pila (mediante POP) y salta a ella (a la posición de memoria) para seguir con lo que se estaba haciendo antes del procedimiento.
Los parámetros pueden ser pasados entre los procedimientos de tres formas: mediante registros de propósito general (guardando los datos en registros antes de ejecutar CALL), en una lista de argumentos (es un método para pasar un número largo de parámetros, que consiste en guardarlos en una lista de argumentos en uno de los segmentos de datos en memoria; entonces al procedimiento se le pasará un puntero apuntando a esa lista), o mediante la pila.
Existe un mecanismo de protección en la IA que reconoce cuatro nieveles de privilegios (enumerados del 0 al 3, siendo el 0 los de un privilegio mayor). La razón de este mecanismo es aumentar la fiabilidad del sistema operativo. Si ocurren dos interrupciones a la vez, se atenderá primero a la que tenga más privilegios y la otra deberá esperar.
La diferencia entre interrupciones y excepciones es que las interrupciones son asíncronas (pueden ocurrir en cualquier momento, normalmente producido por un dispositivo E/S), y las excepciones son síncronas (las genera el procesador cuando detecta unas condiciones anteriormente predefinidas; se pueden prever). El procesador responde a ambos casos de manera similar, para lo que está haciendo (en el programa principal) y salta a un procedimiento (o subrutina) programado para esa interrupcion o excepción, lo ejecuta y vuelve a saltar donde lo dejó en el programa principal.
La IA soporta un método alternativo para producir llamadas a procedimientos, llamando desde las instrucciones ENTRE y LEAVE. Estas instrucciones crean automáticamente frames de pila para llamar a los procedimientos. Esto tiene dos ventajas: Proporciona soporte de lenguaje máquina para implementar lenguajes estructurados en bloques, como C o Pascal; y simplifica las entradas y salidas de los procedimientos en código generado por el compilador.
miércoles, 19 de noviembre de 2008
Entorno básico de ejecución
Los procesadores de Arquitectura Intel (a partir de ahora IA de Intel Architecture) tienen tres modos de operaciones: Modo Protegido (en este modo están disponibles todas las instrucciones y las características de la arquitectura, permitiendo aprovechar la máxima capacidad. Es el modo recomendado.), Modo Real-address (permite programar el procesador con extensiones) y Modo de administración del sistema (este modo proporciona un sistema operativo o ejecurable con un mecanismo transparente para implementar funciones de plataformas específicas). El entorno básico de ejecución es el mismo para los tres modos. La memoria de las direcciones del procesador en el bus se llama memoria física, que se organiza en secuencias de ocho bits (o un byte). Este byte es asignado a una dirección única (esta dirección es la dirección fisica, que tiene un rango de espacio de 0 a 2^(36)-1). Los programas utilizan las facilidades de administración de memoria para acceder a ella, lo que se utilice más eficientemente. No acceden directamente a la memoria física, acceden mediante tres modos: flat (el programa "ve" la memoria como una unidad, un espacio contínuo de direcciones llamado espacio lineal de direcciones. El código, los datos y los procedimientos están contenidos en él. Cada dirección (1 dirección=1 byte) se llama dirección lineal), segmentado (el programa "ve" la memoria como un espacio de direcciones independientes llamados segmentos. Este modo incrementa la fiabilidad de los programas y del sistema), y modo de direcciones reales (Es una implementación específica del segundo modo, en el cual el espacio de direcciones lineales para el programa y el sistema operativo consiste en un array de segmentos de 64 KBytes).El modo de operación protegido puede usar cualquier método de acceso descrito anteriormente. El modo de direcciones reales sólo puede utilizar el método de acceso a memoria de direcciones reales. El modo de administración del sistema usa un método parecido al de acceso de direcciones reales (utiliza una memoria RAM, Random Access Memory).
El procesador tiene 16 registros para el sistema y la programación de aplicaciones, que se pueden dividir en registros de propósito general (para operaciones lógicas y aritmétricas, operaciones para calcular direcciones, y para los punteros de memoria), registros de segmentos (identificación de segmentos en memoria) y registros de estado y control (se utiliza para indicar el resultado de instrucciones aritmétricas, controlar instrucciones de cadenas de caracteres, para las interrupciones, etc).
El puntero de instrucción es un registro que apunta al siguiente segmento del código para la próxima instrucción a ejecutar. No se puede acceder mediante software, está controlado implícitamente por instrucciones de control (tales como JMP, CALL o RET), por las interrupciones y las excepciones.
El procesador tiene 16 registros para el sistema y la programación de aplicaciones, que se pueden dividir en registros de propósito general (para operaciones lógicas y aritmétricas, operaciones para calcular direcciones, y para los punteros de memoria), registros de segmentos (identificación de segmentos en memoria) y registros de estado y control (se utiliza para indicar el resultado de instrucciones aritmétricas, controlar instrucciones de cadenas de caracteres, para las interrupciones, etc).
El puntero de instrucción es un registro que apunta al siguiente segmento del código para la próxima instrucción a ejecutar. No se puede acceder mediante software, está controlado implícitamente por instrucciones de control (tales como JMP, CALL o RET), por las interrupciones y las excepciones.
martes, 18 de noviembre de 2008
Introducción a la microarquitectura avanzada de la familia de procesadores P6 de Intel
El procesador de la familia P6 de Intel es una evolución del Pentium, y la base del Pentium II y del Pentium III que implementa significativos avances: el procesamiento en paralelo, es capaz de decodificar, enviar, y completar ejecuciones de tres instrucciones por cada ciclo de reloj. Para ello el P6 usa un superpipeline de doce fases independiente que soporta ejecución de instrucciones desordenada. Para garantizar el suministro seguro de las instrucciones y de los datos al pipeline de ejecución de instrucciones, incorpora dos niveles de caché. La pieza central del P6 es un mecanismo de ejecución desordenada llamada "ejecución dinámica", que incorpora tres conceptos de procesamiento de datos: Deep branch prediction (permite al P6 decodificar instrucciones justo en los branches para llenar la pipeline de instrucciones), Dynamic data flow analysis (analiza en tiempo real el flujo de datos del procesador para determinar las dependencias de los datos y los registros y detectar oportunidades de ejecución de instrucciones desordenada) y Speculative execution (permite al P6 ejecutar instrucciones por delante del contador de programa pero asigna el resultado en el orden del cauce de instrucciones original) Todo esto permite que con la ejecución de instrucciones desordenadamente pueda haber seis ejecuciones de instrucciones por cada ciclo, utilizando toda la capacidad. Al final, asigna el resultado de la ejecución de instrucciones en el orden del programa original para mantener la coherencia del programa y la integridad de los datos.
Suscribirse a:
Entradas (Atom)