Arquitecturas de 16 bits de Intel: 8086, 8088, 80286 Patricia Borensztejn Organización del Computador 2 Agosto 2016 Arquitecturas de los 70 Una arquitectura difícil de explicar e imposible de amar (P&H: Computer Organization and Design) 8086 : arquitectura de 16 bits • Dos unidades funcionalmente separadas: – Unidad de Ejecución (EU) – Unidad de Intercambio con el Bus (BIU) • Aparece (y nunca mas desaparecerá) la segmentación de direcciones: – Una dirección de memoria se construye con: • Dirección Base de Segmento • Desplazamiento respecto a algún segmento (cuya base esta en un registro de segmento) 8086: Segmentación • Hay 20 señales para direccionar memoria, es decir, se direcciona 220 bytes = ¡1 Megabyte!! • Fantástico, mas memoria, pero el tema es : ¿como guardamos 20 bits en un camino de datos de 16 bits? – Aparece la idea de que los programas vean a toda la memoria dividida en segmentos de 64K bytes y direccionen datos e instrucciones relativas al principio del segmento. – Intel incorpora a su arquitectura los registros de segmento. Son: CS, DS, ES, SS. Es el software el encargado de darles un valor inicial. 8086: Segmentación • Hay 20 señales para direccionar memoria, es decir, se direcciona 220 bytes = ¡1 Megabyte!! • Fantástico, mas memoria, pero el tema es : ¿como guardamos 20 bits en un camino de datos de 16 bits? – Aparece la idea de que los programas vean a toda la memoria dividida en segmentos de 64K bytes y direccionen datos e instrucciones relativas al principio del segmento. – Intel incorpora a su arquitectura los registros de segmento. Son: CS, DS, ES, SS. Es el software el encargado de darles un valor inicial. 8086: Segmentación • Los segmentos tienen longitud variable pero su tamaño máximo es 64K bytes • Los segmentos pueden solaparse entre si • Los segmentos deben comenzar en direcciones múltiplos de 16 • En todo momento, el programa puede tener acceso simultáneo a 4 segmentos. • Si no se especifica otra cosa , hay un registro de segmento por defecto para instrucciones (CS), datos (DS) y pila (SS) 8086: Segmentación • Entonces tenemos dos tipos de direcciones: – Direcciones físicas: 20 bits – Direcciones lógicas: Base de Segmento + Offset dentro del segmento • La función de la Unidad de Intercambio con el Bus es la de : – Convertir una dirección lógica a física. – Llevar a cabo las transacciones con el exterior. 8086: Cálculo del offset • En el caso de las instrucciones, el offset está contenido en el registro PC. (que está en la BIU). Su registro de segmento es CS. • En el caso de la Pila, el SP apunta al tope de la pila y se usa como offset en las instrucciones PUSH y POP. • En el caso de los operandos : lo calcula la UE según el modo de direccionamiento especificado en la instrucción. Intel llama dirección efectiva (efective address) , al resultado de este cálculo. • Caso particular, las instrucciones de strings obtienen su dirección efectiva de los registros SI y DI (fuente, destino) 8086: Modos de Direccionamiento 8086: Modos de Direccionamiento • Cosas: – No todos los registros pueden utilizarse para direccionar (AX, CX, DX, no pueden ser usados – Los clks pueden ser de 200nseg (5Mhz) o 125nseg(8Mhz) o 100nseg (10Mhz) Modos de Direccionamiento • Directo: la dirección efectiva está en la instrucción • Registro Indirecto: la dirección efectiva está en el registro. Los registros pueden ser BX, BP, SI o DI • Modo Base: La dirección efectiva se calcula sumando un registro base (BX o BP) mas un desplazamiento. Si el registro base es BP, el registro de segmento por defecto era SS • Modo Indexado: La dirección efectiva se calcula sumando un registro índice (SI o DI) mas un desplazamiento. • Modo Base Indexado: La dirección efectiva se obtiene sumando un registro Base, un registro Índice y un desplazamiento . Otra vez, si aparecía BP en la base, el registro de segmento era SS. • Nota: un chino era….uno cometía muchísimos errores! No te alcanzaban nunca los registros! ¡Mi reino por un registro! Instrucciones y Formatos • Hay alrededor de 100 instrucciones a nivel lenguaje ensamblador. Y 300 a nivel lenguaje máquina. A veces, según el ensamblador utilizado, una instrucción lenguaje ensamblador puede generar dos traducciones diferentes lenguaje máquina. Asombroso. Por ejemplo, la instrucciones que utilizan al acumulador como registro. Pueden codificarse de dos formas diferentes. Obvio, eso no nos importa demasiado… • Formatos: La longitud de la instrucción es variable y conforme fue incrementándose el juego de instrucciones, bits aislados empezaron a usarse para codificar en forma conjunta… una mezcla. Lo que dicen P&H, imposible de explicar. La Memoria • Una cosa que no debe pasar inadvertida de la arquitectura 8086 (8088) es la cola de instrucciones que hay en el BIU. • Ya , en esa época, los diseñadores se dieron cuenta que había que ganar tiempo accediendo a memoria mientras el procesador estaba ocupado haciendo otras cosas internamente. • Asi fué que el 8086 usó una muy primitiva segmentación en la ejecución de instrucciones . Veamos. 8086 Fetch Cola Decodificación Ejecución • Fetch: Mueve 2 bytes de la cache a la cola de prefetch (6 bytes) • D: Determina la longitud de la instrucción, decodifica prefijos y códigos de operación. Solapa con el último ciclo de la etapa de ejecución. • Ex: Computa direcciones de operandos.Acceso a Memoria. Lectura de Registros. Ejecución. Actualización de los registros con datos de la ALU o de memoria. 4.77Mhz PC • Un acceso a memoria (ciclo de bus) comprendía 4 ciclos de procesador. – T1: el procesador presenta las señales de direcciones y control – T2: cambian las señales de sentido de manera de transportar datos – T3 y T4: comienza la transferencia de datos que debe durar como máximo dos ciclos. • El ciclo del procesador es de 200 nseg por lo tanto se requieren memorias de 400 nseg. • La BIU llena la cola cuando hay dos (o mas) bytes libres en ella. • El funcionamiento de la UE y la BIU es asíncrono. • Las instrucciones necesitan para ejecutarse un número variable de ciclos, por ejemplo: – ADD , 4 ciclos – MUL, 70 ciclos 8086: algo mas exacto EU pide un byte de código BIU trae 2 bytes y se los da a la EU. Queda la cola vacía EU calcula la dirección en 7 ciclos y luego pide el acceso al dato BIU trae 4 bytes en 2 ciclos de bus y los almacena en la cola EU usa 9 ciclos para ejecutar la operación aritmética BIU trae el dato pedido por la EU BIU trae 2 bytes de código. La cola se llena BIU está ociosa EU pide un byte de código. BIU está ociosa La UE no espera por instrucciones, el 8086 ha eliminado (casi) el tiempo de fetch de instrucción. 8088 • Es casi idéntico al 8086. Solo tiene dos diferencias: – La cola de instrucciones tiene una longitud de 4 bytes, 6 en el 8086 – El bus de datos es de 8 bits en el 8088, esto lo hace mas fácil de integrar , y a menor costo, dentro de un sistema. Por eso IBM prefirió al 8088 8088: el cerebro del IBM PC • "In the mid-1970s, someone came to me with an idea for what was basically the PC. The idea was that we could outfit an 8080 processor with a keyboard and a monitor and sell it in the home market. I asked, ‘What’s it good for?’ And the only answer was that a housewife could keep her recipes on it. I personally didn’t see anything useful in it, so we never gave it another thought." Gordon Moore. • Entonces ….. ¡Lo hizo IBM! • Citado en: The History of Intel, 30 years of Innovation http://www.landley.net/history/mirror/intel/cn71898a.ht m 8088: el cerebro de la IBM PC • Without knowing the details of the product, Intel sales engineers had to win IBM’s confidence, since "Big Blue" had never used an outside vendor for a key microprocessor before. As the Intel sales engineer who serviced the IBM account recalled, "Everything was very secretive. When we went in to provide technical support, they’d have our technical people on one side of a black curtain and theirs on the other side, with their prototype product. We’d ask questions, they’d tell us what was happening and we’d have to try to solve the problem literally in the dark. If we were lucky, they’d let us reach a hand through the curtain and grope around a bit to try to figure out what the problem was.“ Una última observación • Al 8086 lo diseñó un ingeniero de software llamado Stephen Morse • "For the first time, we were going to look at processor features from a software perspective," says Morse. "The question was not 'What features do we have space for?' but 'What features do we want in order to make the software more efficient?'" That software-centric approach proved revolutionary in the industry. • Morse se fué de Intel , y luego Intel desarrolló el 8088, que según Morse era “una versión mutilada del 8086” • IBM elige a la versión mutilada para su IBM PC. • Any assembly-language program written as far back as 1978 for the Intel 8086 microprocessor will run, unmodified, on Intel's latest Core 2 Extreme CPU--just 180,000 times faster. • Fuente: http://www.pcworld.com/article/146957/components/article.h tml Nos movemos de década: los 80 El 80286 80286 • Primer procesador que puede correr cualquier software escrito para su predecesor. Empieza la compatibilidad. • Introduce soporte por hardware para Memoria Virtual. • Aumenta el espacio físico direccionable a 224 bytes, o sea 16 Megabytes • Dos modos de funcionamiento: – Modo real : los programas utilizan direcciones físicas de 20 bits, tal cual explicamos en el 8086 – Modo protegido: los programas utilizan direcciones virtuales que les permiten direccionar 1 Gigabyte. La traducción a direcciones físicas la realiza la unidad de segmentación generando una dirección física de 24 bits que da acceso a los 16 Megabytes • Se agregan instrucciones y registros para trabajar en modo protegido 80286: Modo Protegido • Se llamó Modo Protegido pues no solo se trataba de soporte para memoria virtual, sino también para multitarea, para que los SO pudieran implementarla. Había que poder proteger a las tareas de diferentes usuarios entre ellas, y también entre los usuarios y el sistema operativo. • La implementación de protección entre tareas es sofisticada y permite a los SO soportar hasta 4 niveles de privilegio. • Obviamente, esto lo estudiarán y lo practicarán en la materia, mas adelante. • Antes del 286 y su modo protegido, MS DOS era un sistema operativo que nos permitía hacer de todo. En esa época, en la materia orga 2 se desarrollaban todo tipo de programas residentes, asi se llamaban. Se programaba el driver de la impresora, del teclado, nos colgábamos de las interrupciones, ¡se programaban virus! En fin, de todo. Arquitecturas de 32 bits de Intel: 80386, i486, Pentium y sus sucesoras de 32 bits Arquitectura de 32 bits: Intel386 intel386 • Everbody hated the 64K byte segments, they limited the size of the data structures and that was perceived to be and was actually a limitation in certain applications. Programmers in particular and compiler writers and others just saw that as a huge limitation. • El 286 no fué un éxito, Bill Gates lo llamaba el “cerebro muerto” y IBM decía que nada podía continuar de allí, que el 286 era el fin de la arquitectura. El proyecto 386 parecía que se moría pero… resucitó… • El equipo siguió adelante con la idea de resolver algunas cosas que no gustaban del 286: – Crear un espacio lineal de direcciones de 32 bits – Aumentar el número de registros, pero eso no se hizo – Hacer un conjunto completo de instrucciones de 32 bits • Lo que también buscaban era competir con el 68000 de Motorola que se veía como la máquina UNIX por excelencia. Nosotros queríamos darle al 386 atributos para que pueda correr unix bien. Teníamos que convertirla en una máquina plana de 32 bits. • La cuestión era como hacer compatible la segmentación del 8086 y del 286 con con un espacio plano de 32 bits no segmentado… Intel 386 • Registros: • Se extienden a 32 bits y se eliminan las restricciones para su uso. Ahora todos pueden utilizarse como registros índice o base. Se agrega un factor de escala a los modos de direccionamiento. • Pueden ser de 8, 16 o 32. Hay prefijos que modifican a la instrucción y también directivas que aplican a todo el código. (use 16, use 32) • Direcciones: • Los offset también pueden ser de 16 o 32 bits. 386: Segmentación y Paginación • Espacio Lineal de 232 bits: – Los segmentos aumentan su longitud a 4 Gigabyes, es decir, a toda la memoria física direccionable. (32 bits de direcciones) – Unidad de Segmentación: Una dirección segmentada, selector + offset, se traduce a una dirección lineal de 32 bits – Unidad de Paginación: soporte de paginación generando la traducción entre dirección lineal y dirección física. • La memoria se puede direccionar de dos maneras: modelo segmentado y modelo chato (flat) 386: Modos de Funcionamiento • Modos de funcionamiento: – – – Modo real: el del 8088. Toda la máquina te pertenece. Modo protegido Modo virtual : es como el real pero dentro de modo protegido, es decir permite diversas tareas modo real ejecutándose en un entorno de multitarea y protegido. i486 • 4ª generación de compatibles binarios • Tres grandes innovaciones: 1. Segmentado para poder ejecutar una instrucción por ciclo 2. On Chip Caché 3. Incorpora la Unidad de Coma Flotante i486: Block Diagram Pipeline en el i486 • El objetivo es ejecutar una instrucción por ciclo. • La tecnología de memorias hace necesaria la incorporación de la caché de nivel 1 dentro del chip. Ejemplo: i486 Fetch D1 D2 Ex WB • Fetch: Mueve 16 bytes de la cache a la cola de prefetch (5 instrucciones) • D1: Determina la longitud de la instrucción, decodifica prefijos y códigos de operación • D2: Computa direcciones de operandos. • Ex: Acceso a Caché. Lectura de Registros. Ejecución • WB: Actualización de los registros con datos de la ALU o de memoria. Incluye cortocircuito ALU-ALU. i486: Retardo cero para cargas cortocircuito Fetch D1 D2 Fetch D1 Fetch Ex MOV Reg1, Mem1 WB D2 D1 Ex D2 ADD Reg1, Reg2 WB Ex WB MOV Mem2, Reg1 i486: Retardo 1 para carga de punteros Fetch D1 D2 Ex Fetch D1 D2 MOV Reg1, Mem1 WB Ex ADD Reg1, [Reg1] WB Cortocircuito Fetch D1 D2 Fetch D1 Ex MOV Reg1, Mem1 WB D2 Ex WB ADD Reg1, [Reg1] I486: Pipeline • The i486 CPU: Executing Instructions in One Clock Cycle. John Crawford, Intel Corporation. IEEE Micro, February 1990 • Asi como en el caso de i386, la lucha fue contra Motorola, que tenía excelentes procesadores de 32 bits, (68000 y 68020), en este caso estaban peleando con los diseños RISC que se basaban en el pipeline para optimizar rendimiento. • El diseño del 486 demandó un enorme esfuerzo donde estuvieron involucrados muchos grupos de personas de toda la Corporación Intel.. Unidad de Coma Flotante • Hasta ahora, para trabajar con números reales había que integrar un chip al sistema: – 8087, 80287, 80378 eran coprocesadores, con los cuales el procesador se comunicaba usando el bus, como con cualquier otro dispositivo de ES. – El i486 integra esa unidad como unidad funcional dentro del propio chip. – La Unidad de Coma Flotante es bastante particular y tiene un entorno de ejecución propio. X87 FPU: Formatos de Datos X87: Entorno de Ejecución Arquitectura de Pila • En la mayoría de las operaciones los operandos son implícitos: el tope de la pila , por ej. • Todas las operaciones operan en la precisión extendida, de hecho, se almacenan los datos en la pila de registros en precisión extendida. Si es necesario se realiza la conversión pertinente. Nos movemos de década: los 90 Intel Pentium • 5ª generación compatible: P5 • Lo mas importante es que se vuelve superescalar, o sea, es capaz de ejecutar hasta dos instrucciones por ciclo. Con muchas restricciones, claro. Por algún motivo, decidieron ahorrar área y no había una replicación completa de recursos, por lo cual algunas instrucciones solo podían ejecutarse en una de las dos vías (u y v) • En 1995, el R10000 de MIPS (Machine without Interlocks Stage) (Hennessey, Stanford, 1981 crea MIPS) era superescalar de 4 vías ya. Incomparable arquitetura. Los Rxxx fueron el cerebro de Silicon Graphics ( Jurasic Park, 1993) Además, eran UNIX… MIPS llevaba 15 años de desarrollo cuando sale el R10000. El R10000 tiene todo. Lo que poco a poco Intel fue, a lo largo de los años, incorporando a sus microarquitecturas. • Curiosidad: bug en la unidad de CF con la instrucción FDIV (errata 23 floating point bug) Arquitectura Pentium Intel Pentium • Para lograr el mejor rendimiento, había que escribir código apareable. • Intel clasifica las instruciones en 4 categorías: – – – – NP : No apareables UV: apareables en cualquier pipe PU: solo apareables en U PV : solo apareables en V • El apareamiento no es posible cuando: – Las siguientes dos instrucciones son NP – Las siguientes dos instrucciones tienen algún tipo de contención entre registros (implícita o explícita). (Hay excepciones) – Las instrucciones no están en la caché. Clasificación de Instrucciones • NP (No Apareables) – Shift/Rotate con CL – Operaciones largas: MUL, DIV – Operaciones extendidas : CMOV, PUSHA, etc – Instrucciones inter-segmento: CALL FAR, Jcc offset 32, PUSH sreg Clasificación de Instrucciones • UV (Pueden ejecutar en cualquier pipe) – La mayoría de las operaciones de 8 y 32 bits: • • • • • • • • • • • MOV reg, reg/mem/inm MOV reg/mem, reg Aritméticas y de ALU reg, reg/mem/inm transferencia ALU reg/mem, reg INC/DEC reg/mem LEA reg, mem PUSH reg/inm Operaciones de pila usando registros POP reg NOP CMP reg, reg/mem/inm Todas las comparaciones TEST reg, reg/mem/inm Clasificación de Instrucciones • PU (Sólo pueden ejecutar en el pipe u) – Instrucciones que suman/restan el carry • ADC/SBB reg, reg/mem/inm • ADC/SBB reg/mem, reg – Instrucciones con prefijos – Shifts con valores inmediatos • SHIFT/ROT inm/1 • PV (Pueden ejecutar en cualquier pipe, pero sólo aparean cuando están en el V) – Instrucciones simples de control • CALL/JMP near • Jcc short • OF Jcc near Pentium con MMX • Introducción de instrucciones MMX (modelo SIMD ) las instrucciones pueden operar en paralelo sobre varios datos a la vez. • Curiosidad: para no gastar mas área, y considerando que quien programara con enteros en MMX no intercalaría en el mismo trozo de código instrucciones de CF, entonces decidieron implementar los registros de MMX sobre la pila de CF, total, cabían !!(64 MMX, 80 CF) P6: Pentium Pro y sucesoras • 6ª Generación de Compatibles IA-32. • El cambio mas importante se da a nivel de microarquitectura, agregando técnicas superescalares , y , sobretodo, rompiendo las instrucciones de la arquitectura en microinstrucciones tipo RISC internamente: el modelo de ejecución y la arquitectura que el programador usa NO ES MAS lo que sucede en el chip realmente. • Se continúa extendiendo el conjunto de instrucciones SIMD. Aparece SSE, esta vez ocupando un área idependiente. P6: Pentium Pro y sucesoras • Este cuadro es increible! P&H: Computer Organization and Design Procesadores de 64 bits Arquitecturas de 64 bits • La primera implementación fue en ¿2004? IA-64: cambiamos de década • Pongo los últimos del manual…. Hay mucho en el medio! IA-64: Itanium • Se introduce en 2001. Era una arquitectura de 64 bits. • Una arquitectura completamente nueva, NO COMPATIBLE, pensada para el mercado de servidores y computación de altas prestaciones. • Basada en la arquitectura VLIW, que Intel la hizo suya con otro nombre: EPIC • EPIC quiere decir Explicit Parallelism Instruction Computer. • Es un mundo aparte… ¡Ni RISC, NI CISC, VLIW! • No fue exitosa, pero Intel apostó por ella al principio.. AMD 64 • Mientras tanto, AMD mejora la arquitectura x86 extendiendo no solo el tamaño de memoria direccionable (de eso se trata, de acceder mas y mas memoria) sino también el tamaño de sus registros. • También resuelve un problema que venía de muy lejos, y aumenta el número de registros a 16 (también los registros SSE) • Enfin, Intel no tiene mas remedio que adoptar la extension AMD-64 y la llama EM64T : Extended Memory 64 Technology Entornos o modos de funcionamiento • IA-32: – Modo Protegido, que incluye la habilidad de ejecutar tareas en Modo 8086- Virtual – Modo Real (8086) con la posibilidad de pasar a modo protegido. Así arranca el procesador despues de un reset – Modo Gestión Sistema: para tareas de mantenimiento (seguridad, etc) • IA-64: agrega modo IA-32e que tiene dos submodos – Modo Compatible : permite ejecutar aplicaciones de 16 bits y de 32 bits sin compilar dentro de un SO de 64 bits – Modo 64-bit : permite ejecutar aplicaciones escritas para el espacio lineal de 64 bits. Modo de Ejecución 64 bits Registros de Propósito General • • IA-32 IA-64 – REX es el prefijo que permite usar los nuevos registros y extender los viejos a 64 Esta es la diapositiva 64 FIN