Procesadores de 64 bits Técnicas Digitales III Ing. Gustavo Nudelman 2013
Introducción Desarrollada por AMD en 2003 con el modelo Opteron, continuando con el Athlon para ser luego tomado por Intel en los modelos de PIV Al igual que el modo protegido, para trabajar en 64 bits debemos activar una unidad del procesador a fin de pasar a modo largo o modo IA32e Dicho modo se habilita mediante el bit LME (long mode enable) del registro EFER (Extended Feature Enable Register) El modo largo, posee 2 sub-modos de operación: Compatibility mode : para ejecutar código compatible de IA32 64-bit mode : para ejecutar código de 64 bits El sub-modo se especifica mediante al bit 5 y 6 (D/B y reservado en IA32) del 6to byte del descriptor de segmento (00=16; 01=32; 10=64; 11=reservado). Para pasar de sub-modo (Dentro del modo largo) debemos cambiar de segmento de código
AMD64 / IA32e - Modos de operación Legacy mode
AMD64 / IA32e - Modos de operación
Comportamiento de Long mode Se utilizan descriptores en la GDT de 8 bytes similares los de modo Legacy Los segmentos se tratan como FLAT y en el sub modo 64 no se chequea el campo límite Todos los registros de puntero se extienden a 64 bits aunque todavía se toman como direcciones lineal solo 48 bits. (En modo compatibilidad, los bits 32..47 deben valer 0) Con direcciones lineales de 48 bits, y un sistema de paginación mediante PAE de 4 niveles se obtienen direcciones físicas de 52 bits. No se dispone de conmutación de tarea por Hardware Se puede verificar si es posible pasar a modo largo mediante la instrucción CPUID con la funcionalidad dada por EAX=0x80000001, donde se obtendría el bit 29 de EDX en 1 si el procesador admite este modo
Direccionamiento en long mode PAE 4K
Descriptores para paginación de 4K en long mode NX: Non exec MBZ: Must be zero. If not: General protection IGN: Ignored
Descriptores para paginación de 4K en long mode NX: Non exec MBZ: Must be zero. If not: General protection IGN: Ignored
Direccionamiento en long mode PAE 2M
Descriptores para paginación de 2M en long mode
Descriptores para paginación de 2M en long mode
Modelo de ejecución Los registros de propósito general se expanden a 64 bits Se disponen de 8 nuevos registros de propósito general (r8.. r15) Los registros de puntero pueden ser accedidos por byte Las instrucciones push y pop trabajan con alineaciones de 64 bits. Se dispone de 8 registros XMM nuevos Las extensiones de 64 bits no pueden utilizarse en modo protegido ni en modo compatibilidad EFLAGS se extiende a 64 bits como RFLAGS
Modelo de ejecución RIP
Modelo de ejecución (extensión de registros) 64 32 16 8 RAX RBX RCX RDX RSI RDI RBP RSP EAX ah AX al EBX bh BX bl ECX ch CX cl EDX dh DX dl ESI EDI EBP ESP SI sil DI dil BP bpl SP spl
Modelo de ejecución (nuevos registros) 64 32 16 8 r8 r9 r10 r11 R12 R13 R14 R15 r8d r9d r8w r8b r9w r9b r10d r10w r10b r11d r11w r11b r12d r12w r12b r13d r13w r13b r14b r14d r14w r15d r15w r15b
Registros de control en 64 bits CR0 CR2
Registros de control en 64 bits CR3 CR4
Model-specific registers A partir del procesador Pentium se incorpora un set de registros llamados MSRs (Model Specific Regiters) cuya cantidad puede variar en diferentes modelos. Es por eso que existen 2 instrucciones privilegiadas para trabajar sobre los mismos rdmsr y wrmsr Antes de ejecutar cualquiera de estas 2 instrucciones debemos especificar cual será el MSR a ser accedido mediante ECX Si la implementación no existe ocurrirá una excepción de protección general El registro EFER es uno de los tantos MSRs el cual corresponde a ECX=0C0000080h Luego mediante rdmsr obtenemos el registro en EDX:EAX. (por que no en RAX?) Entonces para setear el bit que habilita long mode del registro EFER debemos hacer el OR correspondiente y luego ejecutar la instrucción wrmsr
Extended Feature Enable Register (EFER)
Activación del modo largo Si bien para pasar a modo largo, debemos activar el bit LME (long mode enable) del registro EFER, este modo funciona solo si está activada la paginación PAE de 4 niveles. Es decir: con el bit LME lo habilitamos pero no lo activamos Como regla de buen comportamiento es conveniente hacerlo desde modo protegido Legacy mode y desactivar la paginación de este modo para armar las tablas que corresponden al modo largo. Cuando el modo largo está efectivamente activado, se lo indica mediante la activación automática del bit LMA (long mode activated) del registro EFER
Activando el modo largo 1. Suponiendo que se encuentra en modo protegido: desactivar la paginación (si es que está activada) 2. Desactivar interrupciones, ya que la IDT en este modo es diferente a la utilizada en IA32 y cargar idtr con la IDT correspondiente 3. Debe estar armado en memoria el esquema de 4 niveles requerido por long mode 4. Activar el bit PAE del registro CR4 5. Cargar CR3 con la base de PML4 6. Setear el bit LME del registro EFER 7. Activar la paginación (CR0.PG) lo que causará la activación del long mode (activándose EFER.LMA)
Comenzando en modo largo 1. Una vez entrado en modo largo, el procesador se encuentra en compatibility mode debido a que CS estaba apuntando a un descriptor utilizado en IA32 (Legacy) 2. Si quisiéramos activar el sub-modo 64, debemos realizar un JMP FAR a fin de apuntar CS a un descriptor acorde a este sub-modo 3. Si tenemos correctamente el registro idtr apuntando a una IDT64 entonces habilitamos interrupciones
Lab 1 Hello world 64 Subtitulo o nombre del capitulo Universidad Tecnológica Nacional
Interrupciones en IA32e Tanto para compatibility mode como para 64 bit mode, se utilizan descriptores de 16 bytes a fin de poder almacenar vectores lineales de 64 bits (a diferencia de IA32 que utiliza descriptores de 8 bytes) Si se estaba trabajando con una IDT en IA32, se deberá cargar el registro IDTR para que apunte a una IDT de 64 bits, antes de pasar a modo largo y habilitar interrupciones. Otra diferencia con respecto a IA32, es que cuando un handler de interrupción es invocado, siempre se guarda el selector SS, independientemente de que exista cambio de nivel de privilegio. Recordar que la pila trabaja con qwords > Debemos retornar de la interrupción con iretq. No existe la puerta de tarea
Descriptor de la IDT en modo largo Se debe apuntar a un selector de código de 64 bits IST (Interrupt stack table): Se incorpora la posibilidad de trabajar con varios stacks diferentes almacenados en una tabla (Debe ser 0 si no se desea trabajar con la tabla del TSS)
Manejo de la pila ante una interrupción en modo largo
Lab 2 Interrupciones 64 Comandos de bochs page <lineal addr> show <instrucction> Subtitulo o nombre del capitulo Universidad Tecnológica Nacional