martes, 30 de diciembre de 2008

inicialización y manejo del procesador

Cada vez que se activa el pin #RESET, cada procesador conectado al bus del sistema proporciona una inicialización del hardware del procesador (conocido como reset de hardware) y una built-in self-test (BIST) opcional. Un reset de hardware pone los registros de cada procesador en un estado conocido y establece el procesador en modo real-address. También invalida las caches internas, los buffers lookaside de traducción (TLBs) y el branch target buffer (BTB). En este punto, la acción que se toma depende de la familia del procesador:
- Los Pentium 4 y Intel Xeon: Todos los procesadores en el bus del sistema ejecutan el protocolo de inicialización MP. Se selecciona un BSP y se ejecuta el código de inicialización de software en el segmento de código actual empezando en el offset del registro EIP. Los APs se ponen en un estado 'wait for startup IPI' (SIPI) mientras el BSP ejecuta el código de inicialización.
- familia P6: La acción es la misma que en los anteriores.
- procesadores Pentium: en estos sistemas siempre es el mismo procesador el que inicializa, y el segundo procesador se para.
- Intel486: El procesador primario empieza ejecutando código de inicialización de software en el segmento del código actual en el offset del registro EIP.
El código de inicialización de software proporciona todas las inicializaciones específicas de los sistemas del BSP o del primer procesador y del sistema lógico. Entonces el BSP despierta a los APs para que cada uno pueda ejecutar su código de configuración. Cuando todos los procesadores están inicializados, configurados, y sincronizados, el BSP empieza a ejecutar un sistema operativo inicial o una tarea.
El código de inicialización de software puede determinar si un procesador contiene una FPU x87 usando la CPUID. El código debe inicializar la FPU x87 y activar las banderas en el registro de control CR0 para reflejar el estado del entorno del FPU x87.
Los procesadores IA-32 y Intel 64 contienen instrucciones internas y caches de datos. Estos caches se activan borrando las banderas CD y NW del registro de control CR0. Como todas las lineas internas de la cache no son válidas después de la inicialización con el reset, no es necesario invalidar la cache antes de activar el caching. Todas las caches externas pueden requerir inicialización y invalidación usando una inicialización específica del sistema y una secuencia de código de invalidación. Dependiendo del hardware y del sistema operativo, se pueden proporcionar facilidades adicionales para la configuración de las caches.
La mayoría de los procesadores IA-32 y Intel 64 contienen registros de modelos específicos (MSRs). Un MSR dado puede no estar soportado por todas las familias y modelos de la IA-32 o de la Intel 64. Algunos MSRs están diseñados según la arquitectura para simplificar la programación del software. Los MSRs que proporcionan control para unas características de relación entre el software y el hardware incluyen:
- Contadores de monitoreo del rendimiento.
- Extensiones de depuración.
- Capacidad de excepciones de comprobaciones de máquina y de su arquitectura.
- MTRR.
- Administración térmica y de energía.
- Soporte de instrucciones específicas.
- Soporte para las características del procesador.
Los MSRs se pueden leer y escribir usando las instrucciones RDMSR y WRMSR, respectivamente.
Los registros de rango de tipo de memoria (MTRRs) permiten a los tipos de caching (o no caching) ser específicos en un sistema de memoria para un rango de direcciones físicas seleccionado. Permiten el acceso a memoria para optimizarlo a varios tipos de memoria como RAM, ROM... En general la inicializacion de los MTRRs se maneja por el código de inicialización de software o BIOS (basic input/output system), que no es un sistema operativo.
Para inicializar las extensiones SSE/SSE2/SSE3/SSSE3 se siguen los siguientes pasos:
- Se comprueba su presencia mediante CPUID
- Se activa la bandera OSFXSR (bit 9 en el registro CR4)
- Se activa la bandera OSXMMEXCPT (bit 10 en el registro CR4)
- Establecer los bits máscara y banderas en el registro MXCSR de acuerdo con el modo de operación que se quiera para las instrucciones SSE/SSE2/SSE3 SIMD en punto flotante.
Al resetear el procesador, se pone en modo real-address. Para inicial el modo protegido, se deben cargar algunas estructuras básicas de datos y módulos de código en la memoria física para soportar inicializaciones posteriores del procesador. Antes de que el procesador cambie al modo protegido, se debe cargar estas estructuras: un IDT, un GDT, un TSS, opcionalmente un LDT, si se usa paginamiento como mínimo un directorio de páginas y una tabla de páginas, un segmento de código con código a ejecutar cuando el procesador cambie, y uno o más módulos de código con administradores de interrupciones y de excepciones. El código de inicialización debe también inicializar estos registros: el GDTR, opcionalmente el IDTR, el CR1 a través del CR4, y los que tengan MTRR los MTRR. Con estas estructuras, módulos, etc cargados, el procesador puede cambiar al modo protegido cargando el registro CR0 con un valor que establece la bandera PE (bit 0).
Una vez el procesador entra en modo protegido después de un reset, el software generalmente no necesita volver al modo real-address, pero si se necesitara ejecutar software escrito para su ejecución en el modo real-address, generalmente es mejor ejecutarlo en el modo virtual-8086 antes que tener que volver a cambiar de modo. Para cambiar al modo protegido es recomendable seguir estos pasos:
- Desactivar las interrupciones.
- Ejecutar la instrucción LGDT para cargar el registro GDTR con la dirección base del GDT.
- Ejecutar la instrucción 'MOV CR0' que activa la bandera PE en el registro CR0.
- Inmediatamente después, ejecutar un JMP largo o un CALL largo.
- El JMP o el CALL justo después del MOV, cambia el flujo de la ejecución y serializa el procesador.
- Si está activada la paginación, el código del MOV, y del CALL o el JMP deben proceder de una página cuya identidad esté mapeada (o sea, que la dirección lineal antes del salto es la misma que la dirección física después de que la paginación y el modo protegido se activen).
- Si se usará una tabla de descriptores local, se ejecuta la instrucción LLDT para cargar el selector de segmento para el LDT en el registro LDTR.
- Ejecutar la instrucción LTR para cargar el registro de tareas con un selector de segmento a la tarea que inicia el modo protegido o a un area que se pueda escribir de la memoria que puede ser usada para guardar la información TSS en un cambio de tarea.
- Actualizar algunos registros de segmentos.
- Ejecutar la instrucción LIDT para cargar al registro IDTR con la dirección y con el límite del IDT de modo protegido.
- Ejecutar la instrucción STI para activar las interrupciones hardware enmascarables y ejecutar las operaciones hardware necesarias para activar las interrupciones NMI.
Si se ejecutan instrucciones entre los pasos 3 y 4 pueden ocurrir errores aleatorios.
Los Pentium 4, Intel Xeon, y los procesadores de la familia P6 tiene la capacidad de corregir erratas cargando un bloque de datos suministrados por Intel en el procesador. Este bloque de datos se llama actualización del microcódigo. Este tipo de actualizaciones sirven para corregir erratas en el procesador. La BIOS, que tiene el lanzador de la actualización, es la responsable de cargarla en el procesador durante la inicialización del sistema. Hay dos pasos en este proceso: el primero es incorporar los bloques de datos de la actualización necesarios en la BIOS, y el segundo es cargarlos en el procesador. La actualización consiste en un binario proporcionado por Intel que contiene un cabezal descriptivo de 48 bytes y de 2000 bytes de datos encriptados. No contiene código ejecutable. Cada microcódigo de actualización está soportado por una lista específica de procesadores. A veces, cuando los datos encriptados sólo soportan un procesador determinado se le añade una tabla de firmas extendida al final de los datos, pero siempre estará presente cuando los datos encriptados soporten múltiples modelos de procesadores. La tabla es una estructura extendida de 20 bytes que contiene un contador extendido de firmas, un checksum, y 12 bytes reservados. Cada estructura de forma de procesador consiste en la firma de procesador, las banderas del procesador, y un checksum. El contador de firmas extendido indica el número de estructuras de firmas de procesador que existe en la tabla de firmas extendida. La actualización comprueba si es compatible con el procesador mediante una invocación a CPUID. Para identificar la plataforma se lee el registro IA32_PLATFORM_ID (MSR 17H) con la instrucción RDMSR.

No hay comentarios: