• Domingo 22 de Diciembre de 2024, 08:07

Autor Tema:  Problemas Con El Salto A Modo Protegido  (Leído 2651 veces)

germancho7186

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Problemas Con El Salto A Modo Protegido
« en: Miércoles 24 de Diciembre de 2008, 23:48 »
0
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.

posman

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Problemas Con El Salto A Modo Protegido
« Respuesta #1 en: Viernes 26 de Diciembre de 2008, 20:05 »
0
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

    1. En el registro de la GDT (GDTR) se guardan 48 bits: 16 bits para el limite y 32 bits para la direccion base. Tu estas declarando unicamente 24 bits (8 bits para el limite y 16 bits para la direccion base)
    2. En el limite, a la resta tambien debes agregar "- 1"

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

germancho7186

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problemas Con El Salto A Modo Protegido
« Respuesta #2 en: Miércoles 7 de Enero de 2009, 19:53 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con El Salto A Modo Protegido
« Respuesta #3 en: Jueves 8 de Enero de 2009, 10:10 »
0
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.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

germancho7186

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problemas Con El Salto A Modo Protegido
« Respuesta #4 en: Viernes 9 de Enero de 2009, 00:34 »
0
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.

posman

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Problemas Con El Salto A Modo Protegido
« Respuesta #5 en: Viernes 9 de Enero de 2009, 00:50 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problemas Con El Salto A Modo Protegido
« Respuesta #6 en: Viernes 9 de Enero de 2009, 08:58 »
0
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? ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.