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.  
 
 Muchas gracias  
 
 - [BITS 16]       ; We need 16-bit intructions for Real mode 
-   
- [ORG 0x7C00]    ; The BIOS loads the boot sector into memory location 0x7C00 
-   
-         cli                     ; Disable interrupts, we want to be alone 
-   
-         xor ax, ax 
-         mov ds, ax              ; Set DS-register to 0 - used by lgdt 
-   
-         lgdt [gdt_desc]         ; Load the GDT descriptor 
-   
-         mov eax, cr0            ; Copy the contents of CR0 into EAX 
-         or eax, 1               ; Set bit 0 
-         mov cr0, eax            ; Copy the contents of EAX into CR0 
-   
-         jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe 
-   
-   
- [BITS 32]                       ; We now need 32-bit instructions 
- clear_pipe: 
-         mov ax, 10h             ; Save data segment identifyer 
-         mov ds, ax              ; Move a valid data segment into the data segment register 
-         mov ss, ax              ; Move a valid data segment into the stack segment register 
-         mov esp, 090000h        ; Move the stack pointer to 090000h 
-   
-         mov byte [ds:0B8000h], 'P'      ; Move the ASCII-code of 'P' into first video memory 
-         mov byte [ds:0B8001h], 1Bh      ; Assign a color code 
-   
- hang: 
-         jmp hang                ; Loop, self-jump 
-   
-   
- gdt:                    ; Address for the GDT 
-   
- gdt_null:               ; Null Segment 
-         dd 0 
-         dd 0 
-   
- gdt_code:               ; Code segment, read/execute, nonconforming 
-         dw 0FFFFh 
-         dw 0 
-         db 0 
-         db 10011010b 
-         db 11001111b 
-         db 0 
-   
- gdt_data:               ; Data segment, read/write, expand down 
-         dw 0FFFFh 
-         dw 0 
-         db 0 
-         db 10010010b 
-         db 11001111b 
-         db 0 
-   
- gdt_end:                ; Used to calculate the size of the GDT 
-   
-   
-   
- gdt_desc:                       ; The GDT descriptor 
-         dw gdt_end - gdt - 1    ; Limit (size) 
-         dd gdt                  ; Address of the GDT 
-   
-   
-   
-   
- times 510-($-$$) db 0           ; Fill up the file with zeros 
-   
-         dw 0AA55h                ; Boot sector identifyer 
-