Programación General > ASM (Ensamblador)

 Problemas Con El Salto A Modo Protegido

(1/5) > >>

sharek:
Hace ya meses (si, soy patético) que intento, sin éxito desarrollar un sistema operativo de juguete (mejor dicho un cargador de programas con 4 funciones) mi idea es simplemente divertirme, no pretendo hacer nada usable ni nada grande....

Hice mis pinitos con el modo real, un mini entorno con 4 funciones básicas de acceso a disco y demás

El problema vino cuando 1mb me resultó insuficiente para jugar (entiendase jugar por pasarlo bien programando en ensamblador)... aqui entra el modo protegido

Creo los descriptores de segmento, tal y como indica la documentación de intel, 200mil webs y tres o cuatro libros, paso a modo protegido tal y como indica y hago el salto corto para "entrar" a un segmento válido y ete aqui el problema
siempre, SIEMPRE SIEMPRE, invariablemente, si habilito las interrupciones, "error de protección general"

No pego código para no ofender sensibilidades y pq no lo tengo a mano ahora (estoy en la oficina) pero si quereis mas información la pondré mas tarde...

a grandes rasgos... esa excepción solo debería suceder si el segmento no es válido y no creo que sea el caso... ¿alguien sabe si hay que hacer algún paso adicional salvo cargar (lgdt) la tabla de descriptores, crear una tabla de interrupciones (aunque creo que no es imprescindible) pasar a modo protegido, hacer un salto largo y tirar millas?

otra cosa que no acabo de tener claro es como demonios selecciono los selectores...

8h es el primero... 16h es el segundo?

(perdón por ser tan ambiguo... prometo desarrollar mas, con código si el hilo crece)

Eternal Idol:
Primero pasa a modo protegido y despues crea la tabla de interrupciones, que es diferente a la de modo real.

sharek:
Sisis, eso por descontado, perdón si no me hice entender bien, primero salto a modo protegido, después asigno la tabla de descriptores de segmentos y después la tabla de interrupciones.

Es mas, creo que la tabla de interrupciones en modo protegido no es imprescindible, ya que el código debería poderse ejecutar independientemente de si gestionas correctamente las interrupciones (siempre y cuando no te topes con una, claro)

Eternal Idol:

--- Cita de: "sharek" --- Sisis, eso por descontado, perdón si no me hice entender bien, primero salto a modo protegido, después asigno la tabla de descriptores de segmentos y después la tabla de interrupciones.

Es mas, creo que la tabla de interrupciones en modo protegido no es imprescindible, ya que el código debería poderse ejecutar independientemente de si gestionas correctamente las interrupciones (siempre y cuando no te topes con una, claro)
--- Fin de la cita ---
http://www.osdev.org/osfaq2/index.php/InterruptsForDummies

sharek:
Espera, que nos desviamos del tema, las interrupciones ya llegarán, he probado una cosa, he cogido la definicion de los segmentos de el post del Bootloader (por si mis definiciones eran incorrectas) y ahora me da un error bastante gracioso, adjunto código


--- Código: Text --- pasa_a_modo_protegido:  cli  lgdt  [selector_tabla_descriptores]   mov  EAX, CR0  or  AL, 1  mov  CR0, EAX[BITS 32]  jmp 08h:10000h  

es divertido ver como bochs me peta diciendo:


--- Citar ---00001116142i[CPU0 ] >> jmp far 0001:0000 : EA00000100
00001116142e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00001116142i[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called
00001116142i[APIC0] local apic in CPU 0 initializing
00001116142e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1
Next at t=1116142
(0) [0x00007c3f] 07c0:003f (unk. ctxt): jmp far 0001:0000         ; ea00000100

--- Fin de la cita ---


Uso nasm para compilar... ¿pq demonios no entiende el jmp y me ensambla un jmp tan feo como "jmp far 1:0" ? es absurdo!

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa