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.http://www.osdev.org/osfaq2/index.php/InterruptsForDummies (http://www.osdev.org/osfaq2/index.php/InterruptsForDummies)
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)
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
Uso nasm para compilar... ¿pq demonios no entiende el jmp y me ensambla un jmp tan feo como "jmp far 1:0" ? es absurdo!Mil perdones, dije compilar y es ensamblar
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¿Nos desviamos del tema?
Uso nasm para compilar... ¿pq demonios no entiende el jmp y me ensambla un jmp tan feo como "jmp far 1:0" ? es absurdo!
00002428246e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown
status is 00h, resetting
00002428246i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called
00002428246i[APIC0] local apic in CPU 0 initializing
00002428246e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1
Next at t=2428246
(0) [0x00010001] 0008:10001 (unk. ctxt): jmp .+0xfffffffe (0x00000001) ; ebfe
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?Yo tuve el mismo problema y no pasa porque la gtdr este mal sino la direccion a la que apunta el descriptor de la tabla general de descriptores de segmentos.
dd null_descriptorAl principio intentaba pasar a modo protegido una vez cargador el kernel, pero no se porque no logré hacer que funcionara en cuanto la direccion estaba mal.
¿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.Segun entendi, CLI desabilita las interupciones (CLear Interupt) y STI las habilita (SeT Interupt). :S
¿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.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:
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
Segun entendi, CLI desabilita las interupciones (CLear Interupt) y STI las habilita (SeT Interupt). :SNo hablaba de tu codigo Enko, sino de este:
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.
en cuanto al código que genera errores misteriosos en bochs... ¿Alguien ve alguna errata?La verdad que no, pero fijate y comparalo con el codigo que adjunte en el zip:
no entiendo que falla y es realmente decepcionante