• Domingo 16 de Mayo de 2021, 01:46

Autor Tema:  Bootloader GDT, dudas varias  (Leído 3146 veces)

Anthares

  • Nuevo Miembro
  • *
  • Mensajes: 14
  • Nacionalidad: uy
    • Ver Perfil
Bootloader GDT, dudas varias
« en: Lunes 1 de Noviembre de 2010, 02:05 »
0
Hola, estoy intentando entender crear un bootloader en intel 80386 usando nasm.

Soy novata con este tema asi que perdonen si pregunto cosas obvias pero la verdad es que estoy muy mareada.

Si bien entiendo para que sirve la estructura GDT, LDT y como acceder a los distintos segmentos que esten definidos en los descriptores que hay en ellas cargados no entiendo mucho como se crean estas estructuras.

Estoy mirando un articulo que queria poner la ulr pero me dice que no tengo privilegios para hacerlo, le pego mas abajo como hace.

Algunas cosas le entiedo pero otras no, seguramente no me ayuda en que este en ingles.

Mi duda son las siguientes:

1)
Para crear un semento en memoria tengo que crear un descriptor en la tabla GDT que lo defina, entre esos datos esta la base y el limite del mismo.

La base es una direccion de memoria y el limite es el tamaño del segmento verdad?

Ese tamaño es en bytes verdad?

2)

El descriptor tiene 2 Double word que tienen esta estructura:

la primera Double word tiene esta estrucutra      :
Bits                    Function                      Description
0-15                Limite 0:15              los primeros 16  bits del limite del segmento.
16-31            Base 0:15                      los primeros 16 bits  de la base del segmento

la segunda Double word tiene esta estrucutra      :

Bits                    Function                    Description
0-7                    Base 16:23           Bits 16-23 de la base del segmento
8-12                    tipo                           tipo del segmento y atributos
13-14            nivel de privilegio     que para el sitema operativo tiene que ser 0 el privilegio mas alto
15                    bandera de presencia
16-19            limete 16:19           los bits del  16-19 del limite del registro
20-22             atributos                   atributos que dependen del segmento que este definiendo (son interpretados segun el segmento que defina)
23                    granularidad           dice que este usado con el limite determina el tamaño del segmento
24-31            Base 24:31           los ultimos bits para la base del segmento

Alguien me puede explicar como se hace para llenar el descriptor dada la base y el limite?

En el ejemplo entiendo que comienzan llenando la primera palabra doble, usando dw. Es decir la van completando de a 16 bits.

Y la segunda la va completando usando db es decir de a bytes.

Pero estoy muy mareada y no enteindo como llena los valores

3) Lo otro que no entiendo es como uno selecciona en que areas de la memoria le conviene tener los distintos segmentos a usar: codigo, datos, pila

En fin perdonen mi ignorancia y espero que me puedan explicar por que tengo que hacer una tarea y a este ritmo voy a perder de lo lindo.  :hitcomp:

Muchas gracias  :hola:

Código: ASM
  1. [BITS 16]       ; We need 16-bit intructions for Real mode
  2.  
  3. [ORG 0x7C00]    ; The BIOS loads the boot sector into memory location 0x7C00
  4.  
  5.         cli                     ; Disable interrupts, we want to be alone
  6.  
  7.         xor ax, ax
  8.         mov ds, ax              ; Set DS-register to 0 - used by lgdt
  9.  
  10.         lgdt [gdt_desc]         ; Load the GDT descriptor
  11.  
  12.         mov eax, cr0            ; Copy the contents of CR0 into EAX
  13.         or eax, 1               ; Set bit 0
  14.         mov cr0, eax            ; Copy the contents of EAX into CR0
  15.  
  16.         jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe
  17.  
  18.  
  19. [BITS 32]                       ; We now need 32-bit instructions
  20. clear_pipe:
  21.         mov ax, 10h             ; Save data segment identifyer
  22.         mov ds, ax              ; Move a valid data segment into the data segment register
  23.         mov ss, ax              ; Move a valid data segment into the stack segment register
  24.         mov esp, 090000h        ; Move the stack pointer to 090000h
  25.  
  26.         mov byte [ds:0B8000h], 'P'      ; Move the ASCII-code of 'P' into first video memory
  27.         mov byte [ds:0B8001h], 1Bh      ; Assign a color code
  28.  
  29. hang:
  30.         jmp hang                ; Loop, self-jump
  31.  
  32.  
  33. gdt:                    ; Address for the GDT
  34.  
  35. gdt_null:               ; Null Segment
  36.         dd 0
  37.         dd 0
  38.  
  39. gdt_code:               ; Code segment, read/execute, nonconforming
  40.         dw 0FFFFh
  41.         dw 0
  42.         db 0
  43.         db 10011010b
  44.         db 11001111b
  45.         db 0
  46.  
  47. gdt_data:               ; Data segment, read/write, expand down
  48.         dw 0FFFFh
  49.         dw 0
  50.         db 0
  51.         db 10010010b
  52.         db 11001111b
  53.         db 0
  54.  
  55. gdt_end:                ; Used to calculate the size of the GDT
  56.  
  57.  
  58.  
  59. gdt_desc:                       ; The GDT descriptor
  60.         dw gdt_end - gdt - 1    ; Limit (size)
  61.         dd gdt                  ; Address of the GDT
  62.  
  63.  
  64.  
  65.  
  66. times 510-($-$$) db 0           ; Fill up the file with zeros
  67.  
  68.         dw 0AA55h                ; Boot sector identifyer
  69.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Bootloader GDT, dudas varias
« Respuesta #1 en: Lunes 1 de Noviembre de 2010, 11:14 »
0
Primero, cuando un sistema x86 arranca, lo hace en modo real y no en modo protegido, por tanto las tablas de descriptores y todo eso no tienen sentido. Si quieres usar estas características primero tienes que activar el modo protegido. ¿Has tenido esto en cuenta?

Anthares

  • Nuevo Miembro
  • *
  • Mensajes: 14
  • Nacionalidad: uy
    • Ver Perfil
Re: Bootloader GDT, dudas varias
« Respuesta #2 en: Lunes 1 de Noviembre de 2010, 12:56 »
0
Hola, si la idea es pasar a modo protegido, pero antes en modo real crear las estrucutras de la GDT para luego usar al pasar y ya tenerlas cargadas.

Esta la etiqueta que indica al compilador que hay que escribir luego a  32 bits o sea con [BITS 32]  

Por otro lado creo que antes de hacer el cambio tengo que cargar un bit en un registro para hacer el cambio de modo.

Pero mi gran duda era como carga el descriptor de la GDT

Gracias!!!! por responderme  :hola:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Bootloader GDT, dudas varias
« Respuesta #3 en: Lunes 1 de Noviembre de 2010, 14:36 »
0
Cita de: "Anthares"
Pero mi gran duda era como carga el descriptor de la GDT
En el registro GDTR  indicas la dirección de memoria donde vas a cargar el GDT.

Te dejo igualmente la documentación de Intel, donde viene todo: http://www.intel.com/Assets/PDF/manual/253668.pdf

Anthares

  • Nuevo Miembro
  • *
  • Mensajes: 14
  • Nacionalidad: uy
    • Ver Perfil
Re: Bootloader GDT, dudas varias
« Respuesta #4 en: Lunes 1 de Noviembre de 2010, 16:42 »
0
Gracias yo miro ahi, yo me referia igual a como se llena los campos  del descriptor que esta dentro de uno de los registros de dicha tabla, pero lo voy a mirar del manual muchas gracias  :)

posman

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Bootloader GDT, dudas varias
« Respuesta #5 en: Lunes 1 de Noviembre de 2010, 18:35 »
0
Cita de: "Anthares"
1)
Para crear un semento en memoria tengo que crear un descriptor en la tabla GDT que lo defina, entre esos datos esta la base y el limite del mismo.

La base es una direccion de memoria y el limite es el tamaño del segmento verdad?

Si y no. Efectivamente para la GDT hay que especificar la base (direccion de memoria donde inicia) y el limite. Pero tu preguntas si es la base y el limite de cada segmento y eso es incorrecto. La base y el limite son para la GDT completa (la GDT es global y solamente existe una). Dentro de la GDT defines los segmentos. Puedes definir algunos temporales solamente para cambiarte al modo protegido. Despues podrias crear otra GDT y actualizar de nuevo el registro CR3. Con esto ya estarias utilizando la nueva GDT que definiste (con los segmentos que hayas puesto dentro) y la anterior GDT ya no sera valida.

Cita de: "Anthares"
Ese tamaño es en bytes verdad?

Correcto

Anthares

  • Nuevo Miembro
  • *
  • Mensajes: 14
  • Nacionalidad: uy
    • Ver Perfil
Re: Bootloader GDT, dudas varias
« Respuesta #6 en: Lunes 1 de Noviembre de 2010, 18:39 »
0
Gracais x la aclaracion la verdad que habia entendido mal  :argh:

Saludos  :)  :hola:

posman

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Bootloader GDT, dudas varias
« Respuesta #7 en: Lunes 1 de Noviembre de 2010, 18:44 »
0
Cita de: "Anthares"
3) Lo otro que no entiendo es como uno selecciona en que areas de la memoria le conviene tener los distintos segmentos a usar: codigo, datos, pila

No se como podrias seleccionar la parte de memoria mas "conveniente" para tener la GDT, pero hay partes de memoria en donde no deberias ponerla. Al arrancar, el BIOS coloca ciertos datos en memoria y no conviene sobreescribirlos ya que podrian ser de utilidad despues. Aqui esta un link a una pagina (con texto en ingles) donde se muestra el mapa de la memoria al arrancar.

http://wiki.osdev.org/Memory_Map_(x86)

Hay muchas cosas que te pueden servir en esta pagina, aunque esta en ingles
http://wiki.osdev.org

Anthares

  • Nuevo Miembro
  • *
  • Mensajes: 14
  • Nacionalidad: uy
    • Ver Perfil
Re: Bootloader GDT, dudas varias
« Respuesta #8 en: Lunes 1 de Noviembre de 2010, 18:49 »
0
;)  si no importa algo me defiendo con el ingles gracias!  :devil: