Programación de IA-32
   Modo Protegido

      Introducción


    Erwin Meza Vega
IA-32 Modo Protegido
   Permite tener acceso a todas las características
    del procesador
       Se introdujo en la arquitectura Intel en los
        procesadores 286 y se mejoró notablemente con el
        386
       En su aspecto básico, en los procesadores actuales
        funciona de la misma forma que en un 386
       A partir de este modo se puede pasar al modo
        extendido de 32 bits (para procesadores de 64 bits)
IA-32 Modo Protegido
   Características más importantes que se pueden
    usar en modo protegido:
       Protección (niveles de privilegios)
       Modo segmentado *
       Espacio de direcciones lineal de 32 bits (registros de
        propósito general)
       Multitarea
       Acceso a otros modos de operación (modo virtual 8086,
        modo extendido, modo real)
       Paginación de memoria
Paso de Modo Real a Modo
              Protegido
Para pasar de modo real a modo protegido se debe
  realizar por lo menos los siguientes pasos:
• Definir la organización de la memoria, por medio de
  la Tabla Global de Descriptores (GDT)
• Habilitar la línea de direcciones A20, para poder
  especificar direcciones de memoria de más de 20
  bits.
• Modificar el registro CR0 para habilitar el flag PE.
• Saltar a una instrucción que se encuentre dentro
  de un segmento de código válido.
Organización de la memoria
   La memoria se maneja en un esquema segmentado.
   Cada segmento puede tener cualquier un tamaño de: 1
    a 232 bytes
   La memoria se controla mediante descriptores de
    segmento, que se almacenan en una estructura de
    datos denominada GDT.
   Los registros de segmento se denominan “selectores” y
    funcionan de forma diferente al modo real.
   El valor almacenado en los registros de segmento se
    usa como subíndice en la GDT.
Organización de la memoria
 Dirección Lógica
                                  Dirección Lineal
Selector Offset
(16 bits) (32 bits)
                                                              Segmento



           Descriptor de Segmento
                                                     Offset
           Base
           Límite (tamaño)
           Nivel de privilegios



                                                                GDT
Tabla Global de Descriptores (GDT)
Tabla (arreglo) que contiene una serie de estructuras de
  datos llamadas Descriptores.
La GDT puede contener hasta 213 descriptores. Cada
  descriptor tiene un tamaño de 8 bytes (64 bits).
Entre los diferentes tipos de descriptores que se puede
  almacenar en la GDT se encuentran los Descriptores
  de Segmento. Estos almacenan la información de un
  segmento en la memoria:
• Dirección base
• Tamaño
• Privilegios
• Estado
Tabla Global de Descriptores (GDT)
                                       El GDT es una estructura de
                                       datos que se almacena en
                                       memoria. Debe estar alineada
                                       a un límite de 8 bytes.
                                       Su ubicación y tamaño se
                                       describen en el registro GDTR.




Tabla Global de
Descriptores      Descriptor

                  Descriptor
                                       Registro GDTR
                  Descriptor NULO
                                    Base      Límite
Descriptores de Segmento
Dentro de la GDT se almacenan (entre otros)
  descriptores de segmento. En modo protegido, se
  requiere que la GDT contenga al menos tres
  descriptores:
• El primer descriptor de la GDT siempre es nulo
• Un descriptor para el segmento de código
• Un descriptor para el segmento de datos
Por simplicidad, la mayoría de sistemas operativos
  configuran sólo estos tres segmentos.
Los segmentos de código y datos se configuran con
  base = 0 y con límite (tamaño) = 4 GB, lo que
  significa que se utiliza el modo Flat (plano).
Formato de un Descriptor de
        Segmento




            Imagen tomada de: Manual de Intel IA32-3a : Systems Programmer’s Guide Part 1
Registros de Segmento
             (Selectores)
En modo protegido el valor almacenado en un
 registro de segmento (selector) tiene el
 siguiente formato:




          Imagen tomada de: Manual de Intel IA32-3a : Systems Programmer’s Guide Part 1
Línea de Direcciones A20
              (A20 Gate)
• Por razones históricas, cuando el procesador se
  encuentra en modo real, su línea de direcciones
  20 (A20 Gate) se encuentra deshabilitada.
• Cualquier dirección de memoria mayor a 220
  (1MB), se “trunca” al limite de 1 MB.
• Anteriormente la línea A20 se podía habilitar
  mediante un pin en el teclado.
• En la actualidad este pin no existe, pero se
  puede programar el controlador 8042 (teclado)
  para habilitar la línea A20.
Línea de Direcciones A20
                  (A20 Gate)
Para habilitar la línea de direcciones A20 se debe realizar el siguiente
  proceso:
1. Leer el bit de estado del controlador 8042, disponible en el puerto de
    E/S 0x64.
2.   Si el controlador del teclado se encuentra listo, el segundo bit de su
     estado debe ser cero. En caso contrario, ir al paso 1.
3.   Escribir el valor 0xd1 en el puerto de E/S 0x64. El valor 0xd1 le
     indica al controlador que posteriormente se enviará otro byte que
     contiene la configuración a establecer.
4.   Repetir los pasos 1 y 2 para verificar que el controlador de teclado
     haya recibido el comando.
5.   Escribir el valor 0xdf en el puerto de E/S 0x60. Este valor habilita el
     bit A20 dentro del controlador del teclado.
6.   Repetir los pasos 1 y 2 para verificar que el controlador ha aceptado
     el comando.
Registro CR0
Este registro controla la ejecución del procesador.
 Su formato se muestra en la siguiente figura:



              Imagen tomada de: Manual de Intel IA32-3a : Systems Programmer’s Guide Part 1




El bit 0 de CR0 (Protection Enable) permite
  habilitar el modo protegido. No obstante antes
  de habilitar este bit se debe configurar la GDT y
  habilitar la línea de direcciones A20.
Secuencia para paso a modo
                protegido
1. Deshabilitar las interrupciones
  a.   Habilitar la línea de direcciones A20
2. Cargar el registro GDTR con la dirección base y el tamaño
   del GDT configurado con anterioridad.
3. Habilitar el bit 0 (PE) del registro CR0
4. Saltar mediante ljmp o lcall a una instrucción que se
   encuentre dentro de un segmento de código válido en modo
   protegido.
5. Si es necesario, cargar el registro LDTR con un LDT válido.
6. Si se pretende usar multi-tarea, cargar un registro de tareas
   válido en el registro TR.
7. Actualizar los registros de segmento DS, ES, FS, GS y SS
   para que contengan un selector válido.
Pasos adicionales
Al pasar a modo protegido, no se pueden usar los
  servicios de la BIOS.
Se debe configurar una estructura llamada IDT
  (Interrupt Descriptor Table), la cual define las
  rutinas de manejo de interrupción.
Sólo después de configurar una IDT válida se pueden
  habilitar las interrupciones. Si accidentalmente se
  habilitan, el procesador se reiniciará
  automáticamente en la próxima ejecución de reloj
  debido a que no se ha definido una rutina de
  manejo de interrupción.
Referencias

              Manuales de Intel
    http://www.intel.com/products/processor/manuals/
 Intel® 64 and IA-32 Architectures Software Developer's
ManualSystem Programming Guide, Part 1, Order Number
                        253668

Ia32 Modo Protegido

  • 1.
    Programación de IA-32 Modo Protegido Introducción Erwin Meza Vega
  • 2.
    IA-32 Modo Protegido  Permite tener acceso a todas las características del procesador  Se introdujo en la arquitectura Intel en los procesadores 286 y se mejoró notablemente con el 386  En su aspecto básico, en los procesadores actuales funciona de la misma forma que en un 386  A partir de este modo se puede pasar al modo extendido de 32 bits (para procesadores de 64 bits)
  • 3.
    IA-32 Modo Protegido  Características más importantes que se pueden usar en modo protegido:  Protección (niveles de privilegios)  Modo segmentado *  Espacio de direcciones lineal de 32 bits (registros de propósito general)  Multitarea  Acceso a otros modos de operación (modo virtual 8086, modo extendido, modo real)  Paginación de memoria
  • 4.
    Paso de ModoReal a Modo Protegido Para pasar de modo real a modo protegido se debe realizar por lo menos los siguientes pasos: • Definir la organización de la memoria, por medio de la Tabla Global de Descriptores (GDT) • Habilitar la línea de direcciones A20, para poder especificar direcciones de memoria de más de 20 bits. • Modificar el registro CR0 para habilitar el flag PE. • Saltar a una instrucción que se encuentre dentro de un segmento de código válido.
  • 5.
    Organización de lamemoria  La memoria se maneja en un esquema segmentado.  Cada segmento puede tener cualquier un tamaño de: 1 a 232 bytes  La memoria se controla mediante descriptores de segmento, que se almacenan en una estructura de datos denominada GDT.  Los registros de segmento se denominan “selectores” y funcionan de forma diferente al modo real.  El valor almacenado en los registros de segmento se usa como subíndice en la GDT.
  • 6.
    Organización de lamemoria Dirección Lógica Dirección Lineal Selector Offset (16 bits) (32 bits) Segmento Descriptor de Segmento Offset Base Límite (tamaño) Nivel de privilegios GDT
  • 7.
    Tabla Global deDescriptores (GDT) Tabla (arreglo) que contiene una serie de estructuras de datos llamadas Descriptores. La GDT puede contener hasta 213 descriptores. Cada descriptor tiene un tamaño de 8 bytes (64 bits). Entre los diferentes tipos de descriptores que se puede almacenar en la GDT se encuentran los Descriptores de Segmento. Estos almacenan la información de un segmento en la memoria: • Dirección base • Tamaño • Privilegios • Estado
  • 8.
    Tabla Global deDescriptores (GDT) El GDT es una estructura de datos que se almacena en memoria. Debe estar alineada a un límite de 8 bytes. Su ubicación y tamaño se describen en el registro GDTR. Tabla Global de Descriptores Descriptor Descriptor Registro GDTR Descriptor NULO Base Límite
  • 9.
    Descriptores de Segmento Dentrode la GDT se almacenan (entre otros) descriptores de segmento. En modo protegido, se requiere que la GDT contenga al menos tres descriptores: • El primer descriptor de la GDT siempre es nulo • Un descriptor para el segmento de código • Un descriptor para el segmento de datos Por simplicidad, la mayoría de sistemas operativos configuran sólo estos tres segmentos. Los segmentos de código y datos se configuran con base = 0 y con límite (tamaño) = 4 GB, lo que significa que se utiliza el modo Flat (plano).
  • 10.
    Formato de unDescriptor de Segmento Imagen tomada de: Manual de Intel IA32-3a : Systems Programmer’s Guide Part 1
  • 11.
    Registros de Segmento (Selectores) En modo protegido el valor almacenado en un registro de segmento (selector) tiene el siguiente formato: Imagen tomada de: Manual de Intel IA32-3a : Systems Programmer’s Guide Part 1
  • 12.
    Línea de DireccionesA20 (A20 Gate) • Por razones históricas, cuando el procesador se encuentra en modo real, su línea de direcciones 20 (A20 Gate) se encuentra deshabilitada. • Cualquier dirección de memoria mayor a 220 (1MB), se “trunca” al limite de 1 MB. • Anteriormente la línea A20 se podía habilitar mediante un pin en el teclado. • En la actualidad este pin no existe, pero se puede programar el controlador 8042 (teclado) para habilitar la línea A20.
  • 13.
    Línea de DireccionesA20 (A20 Gate) Para habilitar la línea de direcciones A20 se debe realizar el siguiente proceso: 1. Leer el bit de estado del controlador 8042, disponible en el puerto de E/S 0x64. 2. Si el controlador del teclado se encuentra listo, el segundo bit de su estado debe ser cero. En caso contrario, ir al paso 1. 3. Escribir el valor 0xd1 en el puerto de E/S 0x64. El valor 0xd1 le indica al controlador que posteriormente se enviará otro byte que contiene la configuración a establecer. 4. Repetir los pasos 1 y 2 para verificar que el controlador de teclado haya recibido el comando. 5. Escribir el valor 0xdf en el puerto de E/S 0x60. Este valor habilita el bit A20 dentro del controlador del teclado. 6. Repetir los pasos 1 y 2 para verificar que el controlador ha aceptado el comando.
  • 14.
    Registro CR0 Este registrocontrola la ejecución del procesador. Su formato se muestra en la siguiente figura: Imagen tomada de: Manual de Intel IA32-3a : Systems Programmer’s Guide Part 1 El bit 0 de CR0 (Protection Enable) permite habilitar el modo protegido. No obstante antes de habilitar este bit se debe configurar la GDT y habilitar la línea de direcciones A20.
  • 15.
    Secuencia para pasoa modo protegido 1. Deshabilitar las interrupciones a. Habilitar la línea de direcciones A20 2. Cargar el registro GDTR con la dirección base y el tamaño del GDT configurado con anterioridad. 3. Habilitar el bit 0 (PE) del registro CR0 4. Saltar mediante ljmp o lcall a una instrucción que se encuentre dentro de un segmento de código válido en modo protegido. 5. Si es necesario, cargar el registro LDTR con un LDT válido. 6. Si se pretende usar multi-tarea, cargar un registro de tareas válido en el registro TR. 7. Actualizar los registros de segmento DS, ES, FS, GS y SS para que contengan un selector válido.
  • 16.
    Pasos adicionales Al pasara modo protegido, no se pueden usar los servicios de la BIOS. Se debe configurar una estructura llamada IDT (Interrupt Descriptor Table), la cual define las rutinas de manejo de interrupción. Sólo después de configurar una IDT válida se pueden habilitar las interrupciones. Si accidentalmente se habilitan, el procesador se reiniciará automáticamente en la próxima ejecución de reloj debido a que no se ha definido una rutina de manejo de interrupción.
  • 17.
    Referencias Manuales de Intel http://www.intel.com/products/processor/manuals/ Intel® 64 and IA-32 Architectures Software Developer's ManualSystem Programming Guide, Part 1, Order Number 253668