SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: germancho7186 en Miércoles 24 de Diciembre de 2008, 23:48

Título: Problemas Con El Salto A Modo Protegido
Publicado por: germancho7186 en Miércoles 24 de Diciembre de 2008, 23:48
Yo tengo el mismo problema.

Este el código de mi kernel:

Código: Text
  1.  
  2. [BITS 16]
  3.     jmp Start
  4.  
  5. GDT:
  6. GDT_NULL:
  7.     dq 0
  8. GDT_CODE:
  9.     dw 0FFFFh
  10.     dw 0
  11.     db 0
  12.     db 10011010b
  13.     db 11001111b
  14.     db 0
  15. GDT_DATA:
  16.     dw 0FFFFh
  17.     dw 0
  18.     db 0
  19.     db 10010010b
  20.     db 11001111b
  21.     db 0
  22. GDT_END:
  23. GDT_DESC:
  24.     db GDT_END - GDT
  25.     dw GDT
  26.    
  27. Start:
  28.     cli
  29.     mov ax, ax
  30.     mov ds, ax
  31.    
  32.     lgdt [GDT_DESC]
  33.    
  34.     mov eax, cr0
  35.     or eax, 1
  36.     mov cr0, eax
  37.    
  38.     jmp 08h:ProtectedMode
  39.    
  40. [BITS 32]
  41. ProtectedMode:
  42.  
  43.     jmp $
  44.    
  45.  
  46.  

Cuando lo ejecuto en VirtualPC, me aparece un mensaje que dice: "Error irrecuperable del procesador". Alguien me podría explicar porque no funciona.
Título: Re: Problemas Con El Salto A Modo Protegido
Publicado por: posman en Viernes 26 de Diciembre de 2008, 20:05
Cita de: "germancho7186"
Yo tengo el mismo problema.

Este el código de mi kernel:

Código: Text
  1.  
  2. ...
  3. GDT_DESC:
  4.     db GDT_END - GDT
  5.     dw GDT
  6.    
  7. Start:
  8.     cli
  9.     mov ax, ax
  10.     mov ds, ax
  11. ...
  12.  
  13.  

Cuando lo ejecuto en VirtualPC, me aparece un mensaje que dice: "Error irrecuperable del procesador". Alguien me podría explicar porque no funciona.

Veo 2 errores en las declaraciones en GDT_DESC


Código: Text
  1. GDT_DESC:
  2.     dw GDT_END - GDT - 1
  3.     dd GDT
  4.  
  5.  

No entiendo para que utilizas la instruccion mov ax, ax que esta despues de CLI. Tal vez lo que querias utilizar era xor ax, ax para hacer AX = 0. Pero aun asi estaria incorrecto si quisieras asignar ese valor a DS. El segmento de datos, segun tu GDT, deberia tener el valor 0x10 (tercer descriptor, el primer descriptor es el nulo)

El primer descriptor es el nulo, nunca se utiliza.
El segundo descriptor es para el segmento de codigo y el valor que se utiliza para hacer referencia a el es 0x08
El tercer descriptor es el segmento de datos y el valor para utilizar este segmento es 0x10
Título: Re: Problemas Con El Salto A Modo Protegido
Publicado por: germancho7186 en Miércoles 7 de Enero de 2009, 19:53
Aun no logro hacerlo funcionar, ¿que es lo que estoy haciendo mal?

Código: Text
  1. [BITS 16]
  2.     jmp Start
  3. GDT:
  4. GDT_NULL:
  5.     dq 0
  6. GDT_CODE:
  7.     dw 0FFFFh
  8.     dw 0
  9.     db 0
  10.     db 10011010b
  11.     db 11001111b
  12.     db 0
  13. GDT_DATA:
  14.     dw 0FFFFh
  15.     dw 0
  16.     db 0
  17.     db 10010010b
  18.     db 11001111b
  19.     db 0
  20. GDT_END:
  21. GDT_DESC:
  22.     dw GDT_END - GDT - 1
  23.     dd GDT
  24.     dw 0
  25. Start:
  26.     cli
  27.     xor ax, ax
  28.     mov ds, ax
  29.    
  30.     lgdt [GDT_DESC]
  31.    
  32.     mov eax, cr0
  33.     or eax, 1
  34.     mov cr0, eax
  35.    
  36.     ;jmp dword 08h:10000h                   ; ???
  37.     ;jmp dword 08h:ProtectedMode            ; ???
  38.     jmp dword GDT_CODE:ProtectedMode
  39.  
  40.    
  41. [BITS 32]
  42. ProtectedMode:
  43.  
  44.     jmp $
  45.    
  46.  

Estoy usando el NASM.
nasm -f bin kernel.asm -o kernel.bin
Título: Re: Problemas Con El Salto A Modo Protegido
Publicado por: Eternal Idol en Jueves 8 de Enero de 2009, 10:10
Esto no es un Kernel para empezar, es apenas un loader primigenio.

GDT_END - GDT era correcto (da el tamaño justo que tiene que ser numero de descriptores * 8 - tamaño de cada descriptor -) con palabra (dw) como bien dijo posman que debe ser.

El problema que tenes ahora es con el salto y es muy simple de solucionar, el ensamblador asume que el origen de tu programa va a ser 0000:0000h cuando en realidad sera 0000:7C00h, poniendo esta linea al principio hace lo esperado (un bucle infinito):

Código: Text
  1. org 07C00h
  2.  

El salto correcto es:
Código: Text
  1. jmp 08h:ProtectedMode
  2.  

PD. Supongo que ya entendiste parte de lo que te dije en el otro foro.
Título: Re: Problemas Con El Salto A Modo Protegido
Publicado por: germancho7186 en Viernes 9 de Enero de 2009, 00:34
No, el bootloader ya lo tengo, y este debería ser el kernel.

Si escribo el código en 16 bits todo funciona bien, el problema es cuando intento pasar a modo protegido.
Título: Re: Problemas Con El Salto A Modo Protegido
Publicado por: posman en Viernes 9 de Enero de 2009, 00:50
Entonces, si ya tienes el bootloader, en que direccion de memoria estas poniendo el kernel?
Supongo que el error esta en la linea org 07c00h de tu kernel, ya que tu codigo no esta en esa direccion
Título: Re: Problemas Con El Salto A Modo Protegido
Publicado por: Eternal Idol en Viernes 9 de Enero de 2009, 08:58
Entonces es muy probable que la GDT este mal por completo y tengas que calcular las direcciones base de acuerdo a justamente donde este cargado tu "Kernel", si hiciste el loader en lugar de copiarlo y pegarlo de algun lado seguramente podras arreglar este "Kernel".

¿Como va a estar el error en la linea de org si el no la tiene? ...