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)
00001116142i[CPU0 ] >> jmp far 0001:0000 : EA0000010000001116142e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting00001116142i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called00001116142i[APIC0] local apic in CPU 0 initializing00001116142e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1Next 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!
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ódigoUso 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, resetting00002428246i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called00002428246i[APIC0] local apic in CPU 0 initializing00002428246e[CPU0 ] CPU_LOOP bx_guard.interrupt_requested=1Next 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?
dd null_descriptor
¿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.
00001345703i[CPU ] >> jmp far 0008:7c44 : EA447C080000001345703e[CPU ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting00001345703i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called00001345703e[CPU ] CPU_LOOP bx_guard.interrupt_requested=1Next 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). :SLa 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?no entiendo que falla y es realmente decepcionante