Доброго времени суток. Для начала вопрос. Какое минимальное число обработчиков прерываний нужно установить после перехода в защищенный режим? что я должен сделать, дабы безопасно поднять флаг IF?
Теперь суть проблемы - гружу загрузчик, читаю дискету, нахожу вторичный загрузчик(он же ядро), перехожу в защищенный режим, далее кидаю ядро в 0х200000 и перехожу на си код. и все бы хорошо, если бы я в один прекрасный момент не захотел бы разрешить прерывания... =( или, если судить по EXT = 1 векторе, то это внешние прерывания? я, кажется, совсем запутался =(
лог бокса -
Код:
00016171228d[CPU0 ] protected mode activated
00016171237d[CPU0 ] inhibit interrupts mask = 3
00016171237i[MEM0 ] allocate_block: block=0x2 used 0x3 of 0x20
00016202818i[MEM0 ] allocate_block: block=0x1 used 0x4 of 0x20
00016246945d[CPU0 ] inhibit interrupts mask = 1
00016263781d[CPU0 ] interrupt(): vector = 08, TYPE = 0, EXT = 1
00016263781e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
00016263781d[CPU0 ] exception(0x0d): error_code=0042
00016263781d[CPU0 ] interrupt(): vector = 0d, TYPE = 3, EXT = 1
00016263781e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d)
00016263781d[CPU0 ] exception(0x0d): error_code=006a
00016263781d[CPU0 ] exception(0x08): error_code=0000
00016263781d[CPU0 ] interrupt(): vector = 08, TYPE = 3, EXT = 1
00016263781e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08)
00016263781d[CPU0 ] exception(0x0d): error_code=0042
00016263781i[CPU0 ] CPU is in protected mode (active)
00016263781i[CPU0 ] CS.mode = 32 bit
00016263781i[CPU0 ] SS.mode = 32 bit
00016263781i[CPU0 ] EFER = 0x00000000
00016263781i[CPU0 ] | EAX=00000000 EBX=00000002 ECX=0000006b EDX=0010010f
00016263781i[CPU0 ] | ESP=0000ffe8 EBP=0000fff8 ESI=000110f5 EDI=00210000
00016263781i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df IF tf sf zf AF PF cf
00016263781i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
00016263781i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1
00016263781i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00016263781i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00016263781i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00016263781i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00016263781i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1
00016263781i[CPU0 ] | EIP=002003da (002003da)
00016263781i[CPU0 ] | CR0=0x60000011 CR2=0x00000000
00016263781i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00016263781i[CPU0 ] 0x00000000002003da>> mov dword ptr ss:[ebp-4], 0x00000000 : C745FC00000000
00016263781e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00016263781i[SYS ] bx_pc_system_c::Reset(HARDWARE) called
00016263781i[CPU0 ] cpu hardware reset
переходничок на си код
Код:
use32
[EXTERN kernel_main]
[GLOBAL _start]
_start:
mov esp, 0x200000 - 4
call kernel_main
и мэин ядра
Код:
#include "./headers/interrupts.h"
#include "./headers/scancodes.h"
#include "./headers/interrupts/keyboard.h"
#include "./ktty.h"
void kernel_main()
{
InitTty();
Clear();
PutString("C code running...?\n");
InitInterrupts();
InstallInterrupt(0x20, &irq_timer, 0x8e);
InstallInterrupt(0x21, &irq_keyboard, 0x8e);
EnableInterrupts();
for(;;);
}