Arquitectura x86 y x64

Anuncio
UNIVERSIDAD NACIONAL DE INGENIERIA
RECINTO UNIVERSITARIO SIMON BOLIVAR
FACULTAD DE ELECTROTECNIA Y COMPUTACION
Asignatura: Electrónica Digital II
Tema: Arquitectura x86 y x64
Docente: Ing. Carlos Ortega
Integrante: Alberto Antonio Pérez Vásquez
Carné: 2006 - 23437
Grupo: 4N1 – Eo
Fecha de entrega: 21 de noviembre de 2010
Arquitectura x86 y x64
Investigador
Alberto Antonio Pérez Vásquez
[email protected]
________________________________________________________________________________
ABSTRACTO
El microprocesador 80x86 es aquel que utiliza un bus de datos de 16 bits para poder
emplear circuitos de soporte al microprocesador que sean más económicos, estos cuentan
con un tamaño de palabra e instrucciones de 32 bits. Con el pasar de los años y la creciente
necesidad de velocidad y mejoras en el desempeño llevaron a la creación de la arquitectura
80x64 la cual consta con un tamaño de palabra e instrucciones de 64 bits.
The microprocessor 80x86, employ a data bus of 16 bits to be able to use circuits of support
to the microprocessor the fact that they be more economic, these count on a size verbally
and instructions of 32 bits. With the exceeding the years and the increasing need of velocity
and improvements in the performance carried to the creation of architecture 80x64 the as he
counts on a size verbally and instructions of 64 bits.
INTRODUCCION
La familia x86 utiliza la arquitectura de Von Newman la cual consta de unidad de CPU,
Dispositivos de Memoria, dispositivos de I/O. En este diseño se buscaba la comunicación
reciproca entre todos los bloques que lo integran, de esta manera se pueden enviar y recibir
datos tanto de la memoria como de los dispositivos de I/O.
Esta arquitectura consta de tres tipos de bus de sistema mediante los cuales se realiza la
transmisión de datos. Estos son el bus de datos, el bus de direcciones mediante el cual se
transfiere información desde una ubicación de memoria, un dispositivo de I/O y el CPU, el
bus de control el cual esta encargado como bien lo dice su nombre de controlar la
comunicación del procesador con el resto del sistema. Este posee dos canales READ y
WRITE que especifica la dirección del flujo de datos.
Con la necesidad de mejorar algunos de los parámetros para así satisfacer las necesidades
que con el pasar de los años fueron apareciendo se creo x64, esta arquitectura fue
implantada en microprocesadores para supercomputadoras en los años 1960 y en
servidores y estaciones de trabajo basados en RISC (computadora de conjunto reducido de
instrucciones) desde 1990, lo cual nos hace notar que esto se ha venido desarrollando
desde hace varios años atrás.
DESARROLLO
Arquitectura x86
La familia x86 está diseñada siguiendo el modelo de arquitectura de Von Newman la cual
consta de unidad de CPU, Memorias, dispositivos de I/O como se muestra a continuación:
El microprocesador o CPU es el que se encarga de realizar cálculos, comparaciones
numéricas y transferencia de datos como respuesta a las peticiones de los programas
almacenados en memoria. Este esta conformado por la unidad de control, la unidad de
proceso o unidad aritmético lógica (ALU) y los registros.
En este la unidad de control es la que se encarga de gobernar todo el funcionamiento del
ordenador, controla paso a paso la ejecución de las instrucciones que se encuentran en
memoria central y genera las órdenes necesarias para el funcionamiento de la unidad de
procesos y canales. Además, controla el proceso de lectura y escritura de instrucciones y
datos de la memoria central.
La ALU es la que se encarga de ejecutar las operaciones aritméticas y lógicas. Los registros
son dispositivos de un ordenador para el almacenamiento temporal de datos.
Los Registros de la CPU
Estos se dedican a almacenar posiciones de memoria debido a que el acceso a los registros
es mucho más rápido que los accesos de memoria, también son utilizados para controlar
instrucciones en ejecución, manejar los direccionamientos en memoria y proporcionar
capacidad aritmética. En total hay 14 de estos registros cada uno de los cuales está
pensado principalmente para alguna función concreta.
Según su funcionalidad estos se dividen en:
Registros de propósito general o de almacenamiento temporal: Estos son únicos en el
sentido de que se les puede direccionar como una palabra o como un byte.
AX (Registro Acumulador): Este registro es usado en operaciones aritméticas como primer
operando y también como registro de propósito general a disposición del programador.
BX (Registro Base): Se usa principalmente para indicar posiciones de memoria.
CX (Registro Contador): Puede contener un valor para controlar el número de veces que un
ciclo se repite o un valor para corrimiento de bits.
DX (Registro Dato): Se usa como registro auxiliar en operaciones aritméticas con cifras
grandes y como contenedor de datos a la hora de usar instrucciones de comunicación de
puertos.
Estos cuatro registros, como los restantes, son de 16 bits, pero para permitir la realización
de operaciones de tipo byte cada uno de estos cuatro registros esta dividido en dos
subregistros de 8 bits a los que se puede acceder de forma independiente. Así, por ejemplo
AX esta dividido en AL que son los 8 bits inferiores y AH que son los 8 bits superiores. En
consecuencia los demás registros de propósito general se dividen de la misma manera.
De esta forma se tiene que todas las instrucciones ensamblador pueden operar con datos
de 8 y 16 bits dependiendo de lo que se precise. Cabe aclarar que esta división no es
posible en los demás registros.
Registros de Segmento: Son cuatro registros de 16 bits los cuales definen áreas de
64Kbits dentro del espacio de direcciones de memoria. Estas áreas pueden solaparse total o
parcialmente. No es posible acceder a una posición de memoria no definida por algún
segmento: si es preciso, habrá de moverse alguno.
CS (Code Segment): Este registro es usado por el procesador, junto con el registro IP, para
conocer la ubicación de la instrucción que esta siendo ejecutada.
DS (Data Segment): Se usa para indicar dónde están todos los datos del programa que se
esta ejecutando.
SS (Stack Segment): En este registro se indica al procesador dónde esta la zona de
memoria que se usa como segmento de pila, la cual se utilizara para el almacenamiento
temporal de direcciones y datos.
ES (Extra Segment): Es utilizado como apuntador de memoria auxiliar en operaciones
complejas donde se necesitan dos punteros de datos simultáneos.
Registros Apuntadores o Registros de Pila
La pila es un área de memoria muy importante la cual cuenta con dos registros de 16 bits
cada uno que se usan como desplazamiento para apuntar su contenido. Estos son utilizados
como complemento al registro SS.
SP (Stack Pointer): Este registro proporciona un valor de desplazamiento que se refiere a la
palabra actual que esta siendo procesada en la pila.
BP (Base Pointer): Se usa como registro auxiliar y facilita la referencia de parámetros, los
cuales son datos y direcciones transmitidos a través de la pila.
Registros Indice
Son utilizados como desplazamientos complementarios para DS y ES a la hora de indicar la
posición donde se encuentran los datos a los que se desea acceder.
SI (Source Index): Se usa como puntero origen en operaciones de desplazamiento de datos
entre dos zonas de memoria.
DI (Destination Index): Utilizado como puntero de destino en operaciones de desplazamiento
de datos entre zonas de memoria.
Registro de Instrucción
Solo hay uno, el registro IP (Instruction Pointer), el cual es utilizado por la CPU para conocer
la posición relativa a la base CS donde se encuentra la instrucción que se esta ejecutando
en ese momento.
Este puntero cambia automáticamente cada vez que se ejecuta una instrucción o se realiza
un salto a otro punto del programa a causa de una instrucción de salto.
Registro Bandera
Este es un registro de 16 bits, de los cuales 9 sirven para indicar el estado actual de la
maquina y el resultado del procesamiento. Muchas instrucciones aritméticas y de
comparación cambian el estado de las banderas y apoyándose de ellas determinan la
acción subsecuente:
Bit 0 – CF (Carry Flag): Contiene el acarreo de los bits de mayor orden después de una
operación aritmética, también almacena el contenido del último bit en una operación de
corrimiento o de rotación.
Bit 1: No utilizado.
Bit 2 – PF (Parity Flag): Se pone en 1 cuando existe paridad en una operación.
Bit 3: No utilizado.
Bit 4 – AF (Auxiliar Flag): Contiene un acarreo auxiliar del bit 3 en un dato de 8 bits, para
aritmética especializada. Se pone en 1 cuando existe la necesidad de realizar ajustes tras
una operación de tipo BCD.
Bit 5: No utilizado.
Bit 6 – ZF (Zero Flag): Indica el resultado de una operación lógica o de comparación.
Bit 7 – SF (Sign Flag): Contiene el signo resultante de una operación aritmética (0=positivo,
1=negativo).
Bit8 – TF (Trap Flag): Permite la operación del procesador en modo de depuración (paso a
paso).
Bit 9 – IF (Interrupt Flag): Si está a 1, indica que esta permitida la generación de
interrupciones externas.
Bit 10 – DF (Direction Flag): Indica a la CPU hacia donde se desplazan los punteros
relativos en operaciones repetitivas de cadenas de datos. (1=Decremento automático,
0=aumento).
Bit 11 – OF (Overflow Flag): indica desbordamiento del bit de mayor orden después de una
operación aritmética de números signados. (1=existe overflow, 0=no existe overflow)
Bit 12 – 15: No utilizados.
La ALU
Es el segundo principal componente de la CPU. Esta se encarga de realizar las operaciones
aritméticas y lógicas con los datos que recibe, siguiendo ordenes de la unidad de control.
La ALU se encarga de realizar las siguientes operaciones:
 Operaciones aritméticas como suma, resta, multiplicación y división.

Operaciones de lógica binaria como and, or, not, etc.
 Operaciones de rotación y desplazamiento.
 Operaciones de transformación de operando, tales como extensión de signo,
transformación a otro formato de numeración, etc.
Memoria en x86
Todos los ordenadores necesitan memoria para almacenar programas e información, asi
como para cargar y ejecutar los programas. Por lo general, entre mas compleja es la tarea
que se desea realizar, más memoria necesita el ordenador.
Direccionamiento de memoria
Se denomina dirección de memoria al numero asociado correspondiente al lugar que ocupa
cierta información almacenada como una secuencia de bytes.
Dado que en x86 se tiene una longitud de palabra de direcciones de 20 bits es posible
direccionar hasta 1MB de información. Sin embargo la CPU sólo procesa palabras de 16 bits
en sus registros de direcciones y las direcciones de memoria son de 20 bits, por lo que una
dirección no cabe en un registro.
Para solucionar este inconveniente, se ideo el dividir la dirección de un byte en dos partes,
denominadas segmento y desplazamiento, ambos de 16 bits. De esta forma, se pueden
direccionar 1MB y se tiene acceso a toda la memoria del PC.
La notación mas empleada para indicar la dirección de un par segmento – desplazamiento
consiste en separar esos dos valores con dos puntos, utilizando la notación hexadecimal
(por ejemplo: 123h:12h, representa la dirección con segmento 123h y desplazamiento 12h).
Esto suele ser considerado un mal diseño, aunque puede ser aceptable, e incluso útil en el
lenguaje ensamblador. Por el contrario provoca confusión cuando se hace uso excesivo de
los punteros debido a que es posible que dos punteros con valores distintos apunten a la
misma dirección de memoria. Peor aun este esquema de registros solapados hace difícil
expandir el mapa de memoria a más de 1MB.
Al mantener el valor del segmento fijo (lo que ocurre en los programas) y variar únicamente
el valor del desplazamiento solo es posible acceder a almacenar únicamente 64KB, que es
el valor máximo alcanzable con los 16 bits de del registro de desplazamiento. A esta
cantidad de desplazamiento se le denomina segmento de memoria.
Segmentos de memoria de un programa
Por lo general, los programas ejecutables disponen de cuatro segmentos (4 zonas de 64
KB)
1. El segmento de código: En este segmento se encuentran las instrucciones que
forman el programa. Para acceder a los datos contenidos en él, se usa el registro IP
como desplazamiento.
2. El segmento de datos: Contiene los datos que utiliza el programa. Para acceder a
los datos contenidos en él, se suele utilizar los registros SI y DI como
desplazamiento.
3. El segmento de pila: En el se desarrolla la pila del programa, utilizada por trasvases
temporales de datos, llamadas a funciones, etc. Debe estar presente en todos los
programas EXE de forma obligada. Se utiliza el registro SP para acceder a los datos
de este segmento.
4. El segmento extra. Su uso es opcional, y en él se encuentra un segmento definido
por el usuario y que, regularmente, contiene datos adicionales. Para acceder a los
datos contenidos en él, se suelen utilizar los registros SI y DI.
El hecho de que haya más de un registro de segmento hace posible crear programas que
controlen varios bloques de memoria simultáneos de hasta 64 KB cada uno.
Arquitectura x64
Con el pasar del tiempo y las continuas reducciones en el coste de la memoria, al inicio de
los años 1990, comenzaron a aparecer instalaciones con cantidades de RAM próximas a los
4GB, y comenzó a ser deseable el uso de espacios de memoria virtual que superaban el
límite de 4 GB para manejar ciertos tipos de problemas. Como respuesta a esta necesidad
varias empresas empezaron a lanzar nuevas familias con chip de 64bits, los cuales
inicialmente se utilizaron en supercomputadoras, estaciones de trabajo de grandes
prestaciones y servidores.
Las computadoras de 64 bits se han ido moviendo hacia la computadora personal,
comenzando en 2003 con la innovadora tecnología AMD64 (denominada genéricamente
como x86-64 por su completa compatibilidad inversa con los sistemas de x86), los AMD’sK8
(Athlon 64) y la arquitectura Power PC de Macintosh de Apple Computer con los
procesadores PowerPC 970 G5 Antares y a procesadores EM64T en el 2006, basadas
también en tecnología x86-64, llegando a ser comunes en PC de alta gama.
Con la aparición de la arquitectura de x64 efectivamente se incrementa el límite a 264
direcciones, equivalente a 17, 179,869 TB de RAM. Muchos PC de 64 bits del mercado
tienen actualmente un límite artificial en la cantidad de memoria que pueden reconocer,
pues las limitaciones físicas hacen muy poco probable que se vaya a necesitar soporte para
los 17, 179,869 TB de capacidad total.
El cambio de una arquitectura de 32 bits a una de 64 bits es una alteración fundamental, y
muchos sistemas operativos tienen que modificarse ostensiblemente para aprovechar las
ventajas de la nueva arquitectura. El resto del software también tiene que ser portado para
usar las nuevas capacidades.
Mientras las arquitecturas de 64 bits incontestablemente hacen más sencillo el trabajar con
grandes conjuntos de datos en aplicaciones como el video digital, computación científica y
grandes bases de datos, ha existido un debate considerable sobre si los modos de
compatibilidad con 32 bits serán más rápidos que los sistemas de 32 bits del mismo precio
para otras tareas.
Es de notarse que la velocidad no es el único factor por considerar al hacer una
comparación de procesadores de 32 bits y 64 bits. Usos como la multitarea, las pruebas de
carga y el clustering (para computación de alto rendimiento) pueden ser más idóneos para
una arquitectura de 64 bits teniendo en cuenta un desarrollo correcto.
Pros y Contras
Algunos sistemas operativos reservan porciones de espacio de direcciones de procesos
para uso del sistema operativo, reduciendo el espacio total de direcciones disponibles para
asignar memoria para programas de usuario. Esta restricción solo esta presente en las
versiones de Windows de 32 bits, que no tiene habilitado el PAE.
La asignación en memoria de archivos es menos útil con arquitecturas de 32 bits,
especialmente con la introducción de tecnología de grabación de DVD relativamente
económica. Un archivo de 4GB ya no es inusual y tales archivos grandes no pueden ser
asignados fácilmente con arquitectura de 32 bits; solo se puede asignar una región del
archivo en el espacio de direcciones y para acceder al archivo usando asignación de
memoria, estas regiones deben ser localizadas dentro y fuera del espacio de direcciones
según sea necesario.
Esta es una cuestión clave, ya que la asignación de memoria es uno de los métodos más
eficientes para transportar datos del disco a la memoria, cuando es correctamente
implementado por el sistema operativo
La principal desventaja de las arquitecturas de 64 bits es que, con respecto a las de 32 bits,
los mismos datos ocupan ligeramente más espacio en memoria debido al crecimiento de los
punteros y posiblemente otros tipos y al relleno para alineamiento (dependiendo del tipo de
programa, algunos pueden multiplicar su tamaño).
Esto incrementa los requisitos de memoria en un proceso dado y puede tener implicaciones
para el uso eficiente de la caché del procesador. Mantener un modelo parcial de 32 bits es
una manera de manejar esto y es en general razonablemente efectivo. Para esto lo que se
hace es que el código de programa resida en varios espacios de direcciones de 32 bits
mientras que los objetos de datos pueden (opcionalmente) residir en regiones de 64 bits
(implementado por el sistema operativo de altas prestaciones Z/OS).
En la actualidad, muchos programas comerciales están construidos como código de 32 bits,
no de 64 bits, así que no pueden obtener ventajas de los grandes espacios de direcciones
de 64 bits o de registros de 64 bits más anchos y las rutas de datos en procesadores de 64
bits o, en procesadores x86, de los registros adicionales en el modo de 64 bits.
A pesar de esto, los usuarios de sistemas operativos libres o de código abierto han podido
utilizar entornos exclusivos de 64 bits durante años. No todas las aplicaciones necesitan un
gran espacio de direcciones o manipular elementos de 64 bits, así que no se beneficiarían
de los grandes espacios de direcciones o de los registros más anchos y las rutas de datos;
el principal beneficio para las aplicaciones de 64 bits que no se beneficiarían de nada de
esto seria que las versiones de x86 podrían usar mas registros.
Disponibilidad del software
Los sistemas de 64 bits algunas veces carecen de software equivalente escrito para
arquitecturas de 32 bits. Los problemas más graves son debido a controladores de
dispositivos incompatibles. Aunque gran parte del software puede ejecutarse en modo de
compatibilidad con 32 bits, normalmente es imposible ejecutar un controlador de dispositivo
o un programa similar, en ese modo ya que habitualmente se ejecuta entre el sistema
operativo y el hardware, donde no se puede utilizar la emulación directa.
Muchos paquetes de software de código abierto pueden simplemente ser compilados para
trabajar en un entorno de 64 bits en sistemas operativos como GNU/Linux. Todo lo que se
necesitaría en este caso es un compilador para la maquina de 64 bits.
Más allá de los 64 bits
A la fecha, las palabras de 64 bits parecen ser suficientes para la mayoría de usos prácticos.
Aún así, es de mencionarse que el System/370 de IBM usa números de coma flotante de
128 bits, y muchos procesadores modernos incluyen registros de coma flotante de 128 bits.
Sin embargo, el System/370 era notable, en que también usaba números decimales de
longitud variable de hasta 16 bytes de longitud es decir, de 128 bits.
CONCLUSIONES
Con la finalización de este trabajo se puede notar la importancia que trajo consigo la
creación e implementación de la arquitectura x86 en lo que se refiere al desarrollo
tecnológico, el uso de registros los cuales son muy importantes para el funcionamiento
optimo de la misma así como el uso de segmentación en memoria. A pesar de esto el
transcurrir del tiempo y las mejoras y bajos costos de memoria llevaron a la necesidad de
implementar y utilizar mayor cantidad de memoria, lo cual hizo que se desarrollara la
arquitectura de x64 ya que con x86 esto no podía ser posible debido al tamaño de palabra,
los bits de coma flotante.
Con x64 se logro una mejor utilización de espacio en memoria pero debido a la pobre
disponibilidad de software de la misma no se esta aprovechando al máximo todo los
beneficios que esta arquitectura nos puede brindar, mas aun las personas que utilizan
software libre no tienen problema alguno con la utilización de la misma.
A pesar de esto estaremos obligados a migrar a 64 bits antes del “efecto 2038”, por un bug
referido con el tiempo (muy similar al “efecto 2000”) y que afecta a sistemas Unix y basados
en Unix, ya que la representación del tiempo es basada en el sistema POSIX, que se basa
en contar el numero de segundos transcurridos desde el 1 de enero de 1970 a las
00:00:00(ignorando los segundos intercalares).
REFERENCIAS

www.williamstallings.com

http://es.wikipedia.org/wiki/X86

http://es.wikipedia.org/wiki/64_bits

http://www.alegsa.com.ar/Dic/x86.php

http://es.wikipedia.org/wiki/DEC_Alpha

http://es.wikipedia.org/wiki/IA-64

http://es.wikipedia.org/wiki/AMD64

Grupo de Arquitectura de Computadores y Diseño Lógico. UEX, 1997. La
arquitectura del 8086/8088. Germán Galeano Gil. Juan A. Gómez Pulido.

Notas de Maquinas Computadoras I. Prof. Leonardo J. Aguirre

http://es.wikipedia.org/wiki/Categor%C3%ADa:Arquitectura_x86
Descargar