MÉTODOS DE DIRECCIONAMIENTO DEL PROCESADOR Y CONJUNTO DE INSTRUCCIONES

Direccionamiento de memoria
El direccionamiento de la memoria puede considerarse desde dos puntos de vista: Físico y lógico. El primero se refiere a los medios electrónicos utilizados en el ordenador para acceder a las diversas posiciones de memoria. El segundo, a la forma en que se expresan y guardan las direcciones. El sistema de numeración utilizado por los informáticos para representar las direcciones de memoria en el texto escrito no suele ser la decimal (como parecería razonable), sino el hexadecimal La razón es que los números hexadecimales guardan cierta concordancia con las potencias de 2. Por ejemplo, un bus de direcciones de 8 bits puede acceder a 256 posiciones (en hexadecimal es el rango 00-FFh). En caso de direcciones de 16 bits, se puede acceder 65.536 posiciones (es el rango 0000-FFFFh). El bus de direcciones del PC XT, que tiene 20 bits, las posibilidades son 1.048.576 (es el rango 00000-FFFFFh). Como veremos a continuación, puede utilizarse una doble notación: Direcciones absolutas, indicadas por un hexadecimal de cinco dígitos, en el rango 00000-FFFFFh, o en direcciones segmentadas, que utiliza dos grupos de cuatro dígitos hexadecimales.

DIRECCIONAMIENTO DE MEMORIA EN MODO PROTEGIDO.
El direccionamiento de memoria en modo protegido (a partir del 80286 y posteriores) permite acceder a datos y programas localizados por encima y dentro del primer megabyte de memoria. Para direccionar esta sección extendida el sistema de memoria se requiere un cambio en el esquema de direccionamiento de segmento más desplazamiento usado en el modo real. Cuando los datos y programa se direccionan la memoria extendida, se sigue utilizando la dirección de desplazamiento para acceder a la información en el segmento de memoria. Una diferencia consiste en la dirección del segmento ya que no existe en modo protegido. En lugar de una dirección de segmento, el registro de segmento contiene un SELECTOR que elige un descriptor de una tabla. El descriptor especifica la ubicación del segmento en memoria, su longitud y sus derechos de acceso. Dado que el registro de segmento y la dirección de desplazamiento aún acceden a la memoria, las instrucciones del modo protegido son idénticas a las de modo real. De hecho, la mayoría de los programas escritos para funcionar en modo real funcionarán sin cambios en el modo protegido. La diferencia entre los dos modos es la forma en que el microprocesador interpreta el registro de segmento para acceder al segmento de memoria. Otra diferencia, en los 80386 y posteriores, es que en modo protegido la dirección de desplazamiento puede ser un número de 32 bits en vez de utilizar uno de 16 bits como en modo real. Es por esto que puede direccionar hasta 4 Gb de longitud.

El SELECTOR, ubicado en el registro del segmento, elige uno de 8192 descriptores en una de las dos tablas de descriptores. El DESCRIPTOR especifica la ubicación, la longitud y los derechos de acceso del segmento de memoria, aunque no directamente como en el modo real. Por ejemplo, en el modo real, si CS=0008H, el segmento de código inicia en la localidad 00080H. En modo protegido, este número de segmento puede direccionar cualquier localidad de memoria en todo el sistema para el segmento de código. Existen dos tablas de descriptores utilizadas con los registros de segmentos: una contiene descriptores globales y otra, descriptores locales. Los descriptores globales contienen las definiciones de los segmentos que se aplican a todos los programas, mientras que los descriptores locales son generalmente exclusivos de una aplicación. Podríamos llamar descriptor de sistema a un descriptor global, y descriptor de aplicación a uno local. Cada tabla de descriptores contendrá 8192 entradas, por lo tanto una aplicación podría disponer en cualquier momento de 16.384 descriptores. Puesto que un descriptor describe un segmento de memoria, esto permite que puedan ser descriptos hasta 16.384 segmentos de una aplicación.

DIRECCIONAMIENTO DE MEMORIA EN TIEMPO REAL.
El modo real (también llamado modo de dirección real en los manuales de Intel) es un modo de operación del 80286 y posteriores CPUs compatibles de la arquitectura x86. El modo real está caracterizado por 20 bits de espacio de direcciones segmentado (significando que solamente se puede direccionar 1 MB de memoria), acceso directo del software a las rutinas del BIOS y el hardware periférico, y no tiene conceptos de protección de memoria o multitarea a nivel de hardware. Todos los CPUs x86 de las series del 80286 y posteriores empiezan en modo real al encenderse el computador; los CPUs 80186 y anteriores tenían solo un modo operacional, que era equivalente al modo real en chips posteriores. La arquitectura 286 introdujo el modo protegido, permitiendo, entre otras cosas, la protección de la memoria a nivel de hardware. Sin embargo, usar estas nuevas características requirió instrucciones de software adicionales no necesarias previamente. Puesto que una especificación de diseño primaria de los microprocesadores x86 es que sean completamente compatibles hacia atrás con el software escrito para todos los chips x86 antes de ellos, el chip 286 fue hecho para iniciarse en ' modo real ' - es decir, en un modo que tenía apagadas las nuevas características de protección de memoria, de modo que pudieran correr sistemas operativos escritos para microprocesadores más viejos. Al día de hoy, incluso los más recientes CPUs x86 se inician en modo real al encenderse, y pueden correr el software escrito para cualquier chip anterior. Bajo el modo real no existe ningún mecanismo para tener varias tareas ejecutándose concurrentemente, aunque si se pueden tener varios programas cargados en memoria al mismo tiempo, pero inactivos.

En el modo real se puede lograr un pequeño grado de multitarea si interceptamos algunos de los vectores de interrupción que se ejecutan periódicamente, como el temporizador, e insertamos una rutina de usuario bajo esa interrupción. Como puede verse, este tipo de multitarea no tiene ni punto de comparación con la que ofrece el modo protegido del 80386. En el modo real no se puede controlar que un programa, por ejemplo, no pueda acceder a una zona específica de memoria. Un programa en modo real puede acceder a cualquier dirección de memoria direccionable por el procesador, con lo que un programa maligno puede modificar estructuras del sistema operativo o redireccionar vectores de interrupción y tener un control total sobre el sistema. Debido a esta escasa protección que se ofrece en el modo real, aparecen los temibles virus informáticos y otros programas malignos. Tras conocer el modo protegido y haber trabajado con él, me atrevo a afirmar que es imposible realizar un virus para un sistema operativo que trabaje en modo protegido, siempre y cuando ese sistema operativo no deje ninguna puerta de entrada libre al usuario para controlar el sistema. Todas las interrupciones hardware y software son controladas por el procesador en el modo real leyendo de una tabla de interrupciones que se encuentran en las primeras posiciones de memoria física. Cuando se produce una interrupción, se lee de la tabla anterior la dirección donde encontrar su rutina de tratamiento. Como cualquier programa pude acceder a cualquier dirección de memoria, pude manipular este área de memoria e interceptar diversos vectores de interrupción y apuntarlas a rutinas propias, con lo que cualquier programa puede controlar el sistema según desee.

Instrucciones Del Procesador
Cada procesador tiene un conjunto de instrucciones que puede realizar. Por medio de éstas se especifica el programa que queremos que ejecute el procesador. Este conjunto de instrucciones se le conoce como juego de instrucciones. Las mayoría de las instrucciones están formadas por dos partes: la operación y los operandos. La operación es la acción que debe realizarse. Los operandos son los elementos sobre los que se realizará ésta acción. Por lo tanto, dependiendo de su tipo, las instrucciones pueden tener cero uno o más operandos. Sin embargo en todas las instrucciones existe la operación. Cada operación está codificada mediante una secuencia binaria única llamada código de la operación. Como los operandos son también secuencias binarias, cada instrucción se codifica mediante una secuencia de bytes: uno o más para el código de la operación y cero, uno o más para los operandos. Un programa donde sus instrucciones están codificadas como secuencias binarias está en lenguajemáquina. Para ilustrar lo anterior, supongamos un microprocesador básico en el que los códigos de operación sean de un byte y los operandos sean también de un byte. Supongamos

también que el juego de instrucciones que tiene nuestro procesador básico contiene entre otras, las instrucciones mostradas en la tabla.

TÉCNICAS DE SINCRONIZACIÓN DE DATOS
TEMPORIZACIÓN DEL SISTEMA
Reloj del sistema
El reloj de una computadora se utiliza para dos funciones principales: 1. Para sincronizar las diversas operaciones que realizan los diferentes subcomponentes del sistema informático. 2. Para saber la hora. El reloj físicamente es un circuito integrado que emite una cantidad de pulsos por segundo, de manera constante. Al número de pulsos que emite el reloj cada segundo se llama Frecuencia del Reloj. La frecuencia del reloj se mide en Ciclos por Segundo, también llamados Hertzios, siendo cada ciclo un pulso del reloj. Como la frecuencia del reloj es de varios millones de pulsos por segundo se expresa habitualmente en Megaherzios. El reloj marca la velocidad de proceso de la computadora generando una señal periódica que es utilizada por todos los componentes del sistema informático para sincronizar y coordinar las actividades operativas, evitando el que un componente maneje unos datos

incorrectamente o que la velocidad de transmisión de datos entre dos componentes sea distinta. Cuanto mayor sea la frecuencia del reloj mayor será la velocidad de proceso de la computadora y podrá realizar mayor cantidad de instrucciones elementales en un segundo. El rango de frecuencia de los microprocesadores oscila entre los 4,77 megaherzios del primer PC diseñado por IBM y los 200 megaherzios de las actuales computadoras basadas en los chips Intel Pentium. En máquinas de arquitectura Von Neumann la mayoría de las operaciones son serializadas, esto significa que la computadora ejecuta los comandos en un orden preestablecido. Para asegurarnos de que todas las operaciones ocurren justo en el tiempo adecuado, las máquinas 80x86 utilizan una señal alternante llamada el reloj del sistema. En su forma básica, el reloj del sistema maneja toda la sincronización de un sistema de cómputo. El reloj del sistema es una señal eléctrica en el bus de control que alterna entre los valores de cero y uno a una tasa dada. La frecuencia en la cual el reloj del sistema alterna entre cero y uno es llamada frecuencia del reloj de sistema. El timepo que toma para cambiar de cero a uno y luego volver a cero se le llama periodo de reloj, también llamado ciclo de reloj. La frecuencia del reloj es simplemente el número de ciclos de reloj que ocurren en un segundo, en sistemas actuales, éste valor excede los 200 ciclos por segundo, siendo ya común frecuencias del orden de los 366 Mhz. (MegaHertz, que equivale a un millón de ciclos por segundo). Observe que el periodo de reloj es el valor inverso de la frecuencia, por lo tanto, para un sistema de 200 Mhz el periodo es igual a 5 nanosegundos. Para asegurar la sincronización, el CPU inicia una operación ya sea en el flanco ascendente (cuando la señal cambia de cero a uno) ó en el descendente (cuando la señal cambia de uno a cero). Como todas las operaciones de un CPU están sincronizadas en torno a su reloj, un CPU no puede ejecutar operaciones más rápido que la velocidad del reloj.

Acceso a memoria y el reloj del sistema
El acceso a memoria es probablemente la actividad más común de un CPU, se trata en definitiva de una operación sincronizada al reloj del sistema, esto es, la lectura o escritura no puede ser más rápida que un ciclo de reloj, de hecho, en muchos sistemas 80x86 el acceso a memoria toma varios ciclos de reloj. El tiempo de acceso a memoria es el número de ciclos de reloj que el sistema necesita para acceder a una ubicación de memoria, este es un valor importante ya que a mayor número de ciclos menor desempeño. El tiempo de acceso a memoria es la cantidad de tiempo que transcurre desde que se solicita una operación (sea de lectura ó escritura) y el tiempo en que la memoria completa dicha operación. En procesadores de 5 Mhz (80x88, 80x86) el tiempo de acceso a memoria es de aproximadamente 800 ns. (nanosegundos), en cambio, un procesador de 50 Mhz (80x486) el tiempo es de aproximadamente 20 ns. El tiempo de acceso a memoria en el procesador 80x486 es casi 40 veces más rápido que

en el caso del procesador 80x86 porque éste último consume más ciclos de reloj para el acceso a memoria además del incremento en la velocidad de reloj. Los dispositivos de memoria presentan varias características pero las principales son su capacidad de almacenamiento y el tiempo de acceso. Una memoria de acceso aleatorio (RAM) típica tiene una capacidad de 16 ó más megabytes y un tiempo de acceso de 70 nanosegundos ó menos, con estos datos seguramente se estará preguntando cómo es posible que éstas memorias relativamente lentas trabajan en procesadores mucho más rápidos. La respuesta son los estados de espera. Un estado de espera es una señal que se coloca en el bus de control por parte del dispositivo de memoria para detener temporalmente el trabajo realizado por el CPU, como consecuencia utilizar uno o más estados de espera tiene el mismo efecto que reducir proporcionalmente la velocidad de reloj, obviamente introducir estados de espera no es una opción deseable por la reducción en el desempeño del sistema. Los diseñadores de hardware han encontrado un mecanismo que tiene un efecto similar a introducir estados de espera pero sin afectar notablemente el rendimiento de la computadora, a este mecanismo se le llama memoria cache ( se pronuncia "cash"). Una memoria cache es un dispositivo sin estados de espera que se encuentra construida como parte integral del CPU, físicamente se encuentra entre el CPU y los módulos de memoria RAM, su función es evitar la generación de estados de espera por parte de los módulos de memoria RAM y así aprovechar al máximo el rendimiento esperado por el CPU, sin embargo la memoria cache no es un dispositivo perfecto pues hay ocasiones en que no es posible colocar en memoria cache los datos que requiere el programa para ejecutarse forzando al sistema a leer dichos datos directamente de los módulos de memoria RAM y por lo tanto generando estados de espera, cuando ocurre éste fenómeno se le llama pérdida cache (cache miss), cuando tienen éxito las operaciones en memoria cache se le llama éxito cache (cache hit). Por lo general el radio entre éxito y pérdida en memoria cache está entre 85 y 90%. Este rendimiento disminuye al aumentar la cantidad de memoria cache y por esta razón la memoria cache es relativamente pequeña, sus valores de almacenamiento oscilan entre 256 y 512 Kb.

ESTADOS DE ESPERA
Cuando se conectan tarjetas al bus de la PC, un problema común es igualar la velocidad de los ciclos del bus con la de las tarjetas. Es común que una tarjeta sea más lenta que el bus. Así, el bus de la PC esta diseñado para resolver este problema. La señal READY del bus se puede usar para extender la longitud del ciclo del bus para igualar una tarjeta lenta o parar el bus del sistema hasta que se sincronice con el ciclo de la tarjeta. Como se mencionó anteriormente, los ciclos del bus del 8088 normalmente son de cuatro pulsos y se describen por T1 hasta T4. En algunos ciclos el hardware de la PC, automáticamente inserta un pulso ocioso extra llamado TW. La señal READY se usa para insertar estados nuevos o adicionales de espera. Debido a

que los diferentes ciclos del bus requieren distintos tiempos, la señal READY se debe controlar de manera diferente.

Generación de estados de espera en ciclos de bus de memoria
El hardware de la PC no inserta estados de espera en los ciclos de lectura o escritura a memoria, sino que esto lo hace la tarjeta usando la señal READY. La figura 22 ilustra las señales de tiempo necesarias para generar un estado de espera para un ciclo de lectura o escritura a memoria. Los circuitos de la tarjeta madre muestran la señal READY en el flanco de subida del tiempo T2. Esta señal debe ser valida (activo alto) 75 nanosegundos antes del flanco de subida de T2 para que no se genere un estado de espera. Si se requiere un estado de espera, la señal READY debe ser valida (activo bajo) 60 nanosegundos antes del flanco de subida de T2. Si la señal READY se mantiene en bajo hasta el flanco de subida del siguiente pulso, se inserta un estado de espera adicional. Para las operaciones de lectura y escritura de E/S también se usa la señal READY, y los tiempos son los mismos que para acceso a memoria, excepto que la señal READY se muestrea en T3.

INTERRUPCIONES HARDWARE
Durante la ejecución de un programa, el procesador debe interactuar con una serie de dispositivos de entrada/salida: El teclado, las unidades de disco, los puertos serie y paralelo, la tarjeta de red, etc. Normalmente, la velocidad de procesamiento de estos dispositivos es inferior a la del procesador. Así que el procesador tendrá que esperar un tiempo para que el dispositivo se desocupe antes de hacerle una nueva solicitud. ¿Cómo sabe el procesador que el dispositivo ya está listo para la nueva petición?. También, algunos dispositivos requieren la atención del procesador en forma asíncrona, es decir, no en forma periódica. ¿Cómo sabe el procesador que el dispositivo requiere que se le atienda? Hay dos formas en que el procesador puede saber si el dispositivo está listo o si el dispositivo requiere atención: La primera forma es que el procesador esté periódicamente sondeando al dispositivo en cuestión. A fin de asegurarse de poder atender rápidamente a un dispositivo cuando se lo solicita, la frecuencia con el que procesador sondea a los dispositivos debe ser muy alta. Lo anterior produce que el procesador ocupa mucho tiempo interrogando a los dispositivos y en la mayoría de las veces éstos no están listos o requieren de la atención del procesador. La segunda forma, una más eficiente, es hacer que sea el dispositivo el que le avise al procesador cuando esté listo o requiera atención, interrumpiendo al procesador. El procesador dejará de hacer lo que está haciendo para atender al dispositivo para posteriormente regresar a la tarea que estaba ejecutando antes de ser interrumpido. Los dispositivos utilizan una de las líneas del procesador para interrumpirlo. A este tipo de interrupción se le conoce

como Interrupción por Hardware. Para atender a un dispositivo el procesador ejecuta una rutina especial llamada Rutina de Servicio a Interrupciones. Las rutinas de servicio a interrupciones, por lo general, se cargan a la memoria RAM como parte del proceso de iniciación de la computadora. Las interrupciones de cada dispositivo están priorizadas de tal manera que si dos dispositivos desean interrumpir al procesador al mismo tiempo, sólo la de mayor prioridad interrumpirá al procesador.

INTERRUPCIONES SOFTWARE
Un programa escrito en un lenguaje de alto nivel utiliza funciones de la biblioteca estándar, provistas por el compilador empleado, para realizar la mayoría de las tareas relacionadas con el manejo de los dispositivos de entrada y salida, y la gestión de los archivos y memoria. La mayoría de dichas funciones hacen su trabajo mediante llamadas al sistema. Una llamada al sistema invoca a una rutina provista por el sistema operativo para realizar una tarea. En algunas ocasiones la función de biblioteca accesa directamente al hardware para realizar su tarea si es que no existe una rutina del sistema operativo o el desempeño de ésta no es adecuado. Si el programa escrito en un lenguaje de alto nivel necesita realizar una tarea para la cual no existe una función de biblioteca o si el desempeño de ésta no es adecuado, entonces puede ejecutar una llamada al sistema operativo para realizar dicha tarea. De igual manera, si el sistema operativo no provee de una rutina para ejecutar esa tarea o si el desempeño de ésta no es adecuado, entonces el programa puede accesar directamente al hardware. Un programa escrito en ensamblador, normalmente no tiene a su disposición una biblioteca de funciones estándar y por lo tanto para realizar las tareas relacionadas con el manejo de los dispositivos de entrada y salida, y la gestión de los archivos y memoria deberá hacerlo mediante llamadas al sistema. También puede accesar directamente al hardware para realizar su tarea si es que no existe una rutina del sistema operativo o el desempeño de ésta no es adecuado. En la figura 8-1 se muestra como un programa puede acceder a las funciones de biblioteca, rutinas del sistema operativo y hardware para realizar una tarea que implica el manejo del hardware. Las flechas representan las llamadas a funciones de la biblioteca, llamadas al sistema o acceso directo al hardware.

Sign up to vote on this title
UsefulNot useful