Programación General > ASM (Ensamblador)
Problemas Con El Salto A Modo Protegido
Eternal Idol:
¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites.
Enko:
--- Cita de: "Eternal Idol" --- ¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites.
--- Fin de la cita ---
Segun entendi, CLI desabilita las interupciones (CLear Interupt) y STI las habilita (SeT Interupt). :S
La instruccion LGDT carga la tabla de descriptores de segmentos y la instruccion LIDT es la que carga la tabla de interrupciones.
La verdad que en el codigo que puse no quice habilitar las interupciones y si no estoy mal, no se habilitan.
sharek:
--- Cita de: "Eternal Idol" ---¿Cual es la razon para habilitar las interrupciones antes de que arranque el codigo de 32 bits? No tiene sentido, hasta que no hagas tu propia tabla de interrupciones de 32 bits que las habilites.
--- Fin de la cita ---
No habilito las interrupciones hasta que tengo el código en 32bit, después del salto corto, todo y no tener tabla de interrupciones, no debería rebentarme y acabar en un error de protección general, pero, sigo sin ver el porqué peta, pongo el codigo esencial, a ver si veis algún error garrafal:
--- Código: Text --- [BITS 16] jmp 07C0h:inicioinicio:; aqui uso interrupciones de bios para cargar el "nucleo"pasa_a_modo_protegido: cli lgdt [selector_tabla_descriptores] mov EAX, CR0 or AL, 1 mov CR0, EAX jmp 08h:07C00h + modo_protegido[BITS 32]modo_protegido: jmp 08h:10000hselector_tabla_descriptores: dw selector_tabla_descriptores.fin - selector_tabla_descriptores -1 dd 07C00h + selector_tabla_descriptores selector_tabla_descriptores:.nulo: ; Segmento nulo dw 0 ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 00000000b ; Drets d' accés db 00000000b ; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31.codigo: ; Segment de codi lectura/escriptura, no conformat dw 0FFFFh ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 10011010b ; Drets d' accés db 11001111b ; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31.datos: ; Segment de dades, lectura/escriptura, expansió cap avall dw 0FFFFh ; Limit L0-L15 dw 0 ; base B0-B15 db 0 ; base B16-B23 db 10010010b ; Drets d' accés db 11001111b ; Granularitat/D/0/AV/Nibble Limit L16-L19 db 0 ; Base B24-B31.fin:times 510-($-$$) nop dw 0AA55h
el código debería terminar en
--- Código: Text --- jmp 08h:10000h pero por alguna razón bochs rebienta en la linea anterior, en el salto a 32bit:
--- Código: Text --- jmp 08h:07C00h + modo_protegido
--- Citar ---00001345703i[CPU ] >> jmp far 0008:7c44 : EA447C0800
00001345703e[CPU ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00001345703i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called
00001345703e[CPU ] CPU_LOOP bx_guard.interrupt_requested=1
Next at t=1345703
(0) [0x00007c3f] 07c0:003f (unk. ctxt): jmp far 0008:7c44 ; ea447c0800
<bochs:2> 00001345703i[ ] dbg: Quit
--- Fin de la cita ---
Todo apunta a un problema con los descriptores de segmentos, pero yo creo que están bien...
(se que es un palo leer todo el post, pero ya no se donde caer muerto...)
Eternal Idol:
--- Cita de: "Enko" --- Segun entendi, CLI desabilita las interupciones (CLear Interupt) y STI las habilita (SeT Interupt). :S
La instruccion LGDT carga la tabla de descriptores de segmentos y la instruccion LIDT es la que carga la tabla de interrupciones.
La verdad que en el codigo que puse no quice habilitar las interupciones y si no estoy mal, no se habilitan.
--- Fin de la cita ---
No hablaba de tu codigo Enko, sino de este:
--- Código: Text --- [BITS 32]inicio: sti jmp $
sharek:
Soy un plasta, lo se!
pero fijaos en el código de ahora, no habilito las interrupciones y sigue fallando por excepción 13 (err prot general)
soy un liante! al principio no me iba, luego parecía que si, y ahora vuelve a no irme... es un problema en alguna parte del código y no hay tutía
Amf amf
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa