lunes, 1 de diciembre de 2008

Vistazo general sobre la arquitectura del sistema

La arquitectura IA-32 proporciona un amplio soporte para sistemas operativos y desarrollo de software de sistemas. Este soporte ofrece múltiples modos de operación, incluyendo modo real-address(permite un entorno de programación del procesador Intel 8086 con unas pocas extensiones), modo protegido (es el modo nativo de operación del procesador), modo virtual 8086 (permite al procesador ejecutar software 8086 en entorno protegido, y multitarea), y modo de administración de sistemas (es una característica estándar en la arquitectura de todos los procesadores IA-32. Proporciona un sistema operativo o lo ejecuta de manera transparente).
La arquitectura Intel 64 soporta casi todas las facilidades de programación de sistemas disponibles en IA-32 y los amplía a un nuevo modo operativo (modo IA-32e) que soporta un entorno de programación de 64 bits. Este nuevo modo permite al software operar en uno de dos sub-modos: el modo de 64 bits, que soporta sistemas operativos y programas de 64 bits; o el modo compatible que permite ejecutarse a la mayoría del software, coexistiendo con las aplicaciones en un sistema operativo de 64 bits.
El sistema de niveles de IA-32 incluye características útiles en estas operaciones: administración de memoria, protección de módulos de software, multitarea, edición de excepciones e interrupciones, multiprocesamiento, administración de la cache, recursos hardware y administración de energía, y depurar y monitorizar el rendimiento.
Cuando se opera en modo protegido, todos los accesos a memoria pasan o a través de la global descriptor table (GDT) o a través de una local descriptor table (LDT) opcional. Estas tablas contienen entradas llamadas descriptores de segmento. Estos descriptores proporcionan la dirección base de los segmentos además de permisos de acceso, tipos e información útil. Cada descriptor de segmento tiene un selector de segmentos asociado, que proporciona al software que los usa un index en la GDT o LDT, una bandera global/local (depende de si se escogió GDT o LDT), y derechos de acceso a la información. Para acceder a un byte en un segmento, se necesita el selector y un offset. El selector proporciona acceso al descriptor de segmento al segmento; desde el descriptor, el procesador obtiene la dirección base del segmento en el espacio lineal de direcciones, y el offset proporciona la localización del byte relativo a la dirección base. Este mecanismo se puede usar para acceder a cualquier código válido, datos, o segmentos de pila, proporcionado el segmento el cual es accesible desde el nivel de privilegios (CPL, current privilege level) en el que está operando el procesasdor. El CPL se define como el nivel de protección del código del segmento que se está ejecutando.
Además de código, datos, y segmentos de pila que completan el entorno de ejecución de un programa o procedimiento, la arquitectura define 2 segmentos: el segmento task-state (TSS) y el LDT. El GDT no se considera un segmento porque no es accedido por medios de selector de segmento o descriptores de segmento. Los TSSs y LDTs tienen descriptores de segmento definidos para ellos. Esta arquitectura define un conjunto de descriptores especiales llamados puertas (puertas, puertas de interrupciones, puertas trampa, y puertas de tarea), que provocan gateways protegidos a procedimientos del sistema y editores que operan en un nivel de privilegios diferente del de la aplicación. Si el acceso de destino está permitido, el procesador proporciona un selector de segmento para el segmento de destino y un offset en el segmento del código desde la puerta de llamada. Si esto requiere un cambio de privilegios, el procesador los cambia a la pila para conseguir el nivel requerido. El selector de segmentos para la nueva pila se obtiene desde el TSS para la tarea que se está ejecutando. Además las puertas facilitan las transiciones entre segmentos de código de 16 y 32 bits, y entre el modo de 64 bits y el modo compatible.
El TSS (Task-state segments) define el estado del entorno de ejecución para una tarea. Incluye el estado de registros de propósito general, registros de segmentos, registros EFLAGS, el registro EIP, y los selectores de segmentos con punteros a pila para tres segmentos de pila (una pila por cada nivel de privilegios). También incluye el selector de segmentos para el LDT asociado con la tarea y la dirección base de la tabla de paginación. Todo programa ejecutado en modo protegido lleva consigo el contexto de una tarea. El selector de segmento para el TSS para la tarea en ejecución se guarda en el registro de tareas. El método mas simple para cambiar a una tarea es hacer una llamada o saltar a una nueva tarea. Al cambiar a una tarea, el procesador hace lo siguiente:
- guarda el estado de la tarea actual en el TSS actual
- carga el registro de tareas con el selector de segmento para la nueva tarea
- accede al nuevo TSS a travñes del descriptor de segmento en el GDT
- carga el estado de la nueva tarea desde el nuevo TSS en los registros de propósito general, los registros de segmento, el LDTR, el registro de control CR3, el registro EFLAGS, y el registro EIP.
- empieza la ejecución de la nueva tarea
A una tarea también se puede acceder mediante una puerta de tarea. Es similar a una puerta de llamada, excepto en que proporciona más acceso a un TSS que un segmento de código.
Los cambios de tarea hardware no están soportados en el modo IA-32e, sin embargo los TSSs continúan existiendo. La dirección base de un TSS es especificada mediante un descriptor. Un TSS de 64 bits coge la siguiente información importante para operaciones de 64 bits: direcciones de punteros a pila para cada nivel de privilegios, direcciones de punteros para la tabla de interrupciones de pila, y direcciones de offset para el bitmap de permisos de E/S.
Las interrupciones externas, las de software y las excepciones son editadas a través de la interrupt descriptor table (IDT). Esta tabla guarda una colección de puertas descriptor que proporcionan acceso a editores de interrupciones y de excepciones. Como el GDT, el IDT no es un segmento. La dirección de la página para la base de la IDT está en el registro IDT (IDTR). Las puertas descriptor en la IDT pueden ser puertas descriptoras de interrupcion, de trampa, o de tarea. Para acceder al editor de interrupciones o de excepciones, el procesador recibe un vector de interrupción desde el hardware interno, un controlador externo de interrupción, o desde el software. El vector de interrupción provoca un index dentro de la IDT. Si la puerta seleccionada es una puerta de interrupción o una puerta de trampa, el procedimiento del editor asociado se accede de manera similar a llamar a un procedimiento a través de un cambio de tarea.
En el modo IA-32e, los descriptores de interrupciones y el IDTR son expandidos a 16 bytes para soportar direcciones de base 64 bits. Esto es cierto para el modo de 64 bits y el modo compatible. Las puertas de tarea no están soportadas.
La arquitectura soporta o el direccionamiento físico directo de la memoria, o la memoria virtual. Cuando se usa lo primero, se trata una dirección lineal como si fuera una dirección física. La base de direcciones físicas del directorio de páginas está en el registro de control CR3. Una entrada en un directorio de páginas contiene la dirección física de la base de una tabla de páginas, derechos de acceso y información de administración de memoria. Una entrada en la tabla de páginas contiene la dirección física de un marco de páginas, derechos de acceso y información de administración de memoria.
En el modo IA-32e, la memoria física lineal es administrada por un conjunto de estructuras de datos de sistema. En el modo de compatibilidad y de 64 bits, son usados 4 niveles de estructuras de datos de sistema, que incluyen: El map de páginas nivel 4 (PML4), una entrada en una tabla PML4 contiene direcciones físicas de la base de una tabla de punteros a directorios de páginas, derechos de acceso, e información de administración de memoria. La dirección física base del PML4 está en CR3; un conjunto de punteros a directorios de páginas; un conjunto de directorios de páginas; y un conjunto de tablas de páginas.
Para ayudar en la inicialización del procesador y el control de operaciones del sistema, la arquitectura proporciona banderas de sistema en el registro EFLAGS y varios registros de sistema:
- Las banderas del sistema y los campos IOPL en el registro EFLAGS controlan tareas y modos de cambio, editores de interrupciones, tracing de instrucciones, y derechos de acceso.
- Los registros de control (CR0, CR2, CR3 y CR4) contienen una variedad de banderas y campos de datos para controlar operaciones de niveles de sistema.
- Los registros de debug permiten establecer breakpoints para usarlos en la depuración de programas y software del sistema.
- Los registros GDTR, LDTR, y IDTR contienen las direcciones de páginas y los límites para sus respectivas tablas.
- El registro de tareas contiene la dirección de memoria dle TSS para la tarea en curso.
- Registros de modelos específicos (son un grupo de registros disponibles para el sistema operativo o para procedimientos. Controlan extensiones de depuración, la comprobación de la arquitectura de la máquina, etc).
En el modo IA-32e, los 4 registros de tablas de descriptores del sistema (GDTR, IDTR, LDTR y TR (task register)) están expandidas en hardware para que quepan direcciones de 64 bits. Ahora CR8 está disponible, que permite el acceso de lectura/escritura al registro de prioridad de tareas (TPR) de modo que el sistem operativo pueda controlar las clases de prioridad de las interrupciones externas.

No hay comentarios: