В чем может быть проблема?
Проблема может быть в чём угодно, чтобы сказать точнее нужен полный собирающийся код.
Вот эта структура:
struct IDTPtr {
uint16_t limit;
uint32_t base;
};
должна быть определена с атрибутом
packed
, иначе компилятор вставляет паддинг для выравнивания поля
base
на границу
uint32_t
, из-за чего в IDT загружается неверный адрес.
Ну и, вдобавок, нельзя делать
iret
из середины с++-функции, потому что компилятор организовал в ней кадр стека и вместо возврата
iret
снимает и интерпретирует мусор из этого кадра:
001000e6 <SimpleOS::IDT::dividing_by_zero()>:
1000e6: 55 push %ebp
1000e7: 89 e5 mov %esp,%ebp
1000e9: 53 push %ebx
1000ea: 83 ec 04 sub $0x4,%esp
1000ed: e8 15 01 00 00 call 100207 <__x86.get_pc_thunk.ax>
1000f2: 05 06 11 00 00 add $0x1106,%eax
1000f7: 83 ec 0c sub $0xc,%esp
1000fa: 8d 90 08 fe ff ff lea -0x1f8(%eax),%edx
100100: 52 push %edx
100101: 89 c3 mov %eax,%ebx
100103: e8 4c 00 00 00 call 100154 <SimpleOS::Terminal::print(char const*)>
100108: 83 c4 10 add $0x10,%esp
10010b: fa cli
10010c: cf iret
10010d: 90 nop
10010e: 8b 5d fc mov -0x4(%ebp),%ebx
100111: c9 leave
100112: c3 ret