ОС продолжает загружаться при загрузке IDTC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 ОС продолжает загружаться при загрузке IDT

Сообщение Anonymous »

Итак, я создал базовый IDT для своей собственной ОС на C++, но он продолжает загружаться. gcc вообще не выдает никаких результатов или ошибок, поэтому я не могу найти проблему.
IDT приведен ниже:

Код: Выделить всё

// Define the IDT entry structure

struct IDTEntry {
uint16_t offset_low;
uint16_t selector;
uint8_t zero;
uint8_t type_attr;
uint16_t offset_high;
};

// Define the IDT
IDTEntry idt[256];

// Define a structure for the registers (pushed during exceptions)
struct Registers {
uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
};

// Function to convert a number to a hex string (up to 32-bit)
internal void int_to_hex(uint32_t value, char* buffer) {
const char* hex_chars = "0123456789ABCDEF";
int pos = 0;
bool leading_zero = true;

// Iterate through each nibble (4 bits), from most significant to least
for (int i = 28; i >= 0; i -= 4) {
uint8_t nibble = (value >> i) & 0xF;
if (nibble != 0 || !leading_zero || i == 0) {
leading_zero = false;
buffer[pos++] = hex_chars[nibble];
}
}
buffer[pos] = '\0'; // Null-terminate the string
}

// Custom function to print a hexadecimal register value
internal void print_register(const char* reg_name, uint32_t reg_value, int x, int y) {
char buffer[16];
int_to_hex(reg_value, buffer);

setString(x, y, (char*)reg_name, WHITE);
char temp[] = ": 0x";
setString(x + 5, y, temp, WHITE);
setString(x + 9, y, buffer, WHITE);
}
typedef void (*InterruptHandler)(Registers*);

// Print the registers in hexadecimal format
internal void print_registers(Registers* regs) {
print_register("EAX", regs->eax, 0, 2);
print_register("EBX", regs->ebx, 0, 3);
print_register("ECX", regs->ecx, 0, 4);
print_register("EDX", regs->edx, 0, 5);
print_register("EBP", regs->ebp, 0, 6);
print_register("ESP", regs->esp, 0, 7);
}

// Exception handlers
internal void handle_divide_error(Registers* regs) {
setString(0, 0, (char*)"SYSTEM ERROR\x00", attribute(RED, BLACK));
setString(0, 1, (char*)"Divide by Zero\x00", attribute(RED, BLACK));
print_registers(regs);
}

internal void handle_invalid_opcode(Registers* regs) {
setString(0, 0, (char*)"SYSTEM ERROR\x00", attribute(RED, BLACK));
setString(0, 1, (char*)"Invalid Opcode\x00", attribute(RED, BLACK));
print_registers(regs);
}

internal void handle_page_fault(Registers* regs) {
setString(0, 0, (char*)"SYSTEM ERROR\x00", attribute(RED, BLACK));
setString(0, 1, (char*)"Page Fault\x00", attribute(RED, BLACK));
print_registers(regs);
}

// Define a type for interrupt handler functions

// Set the IDT entry for an exception
internal void set_idt_entry(int num, InterruptHandler handler, uint8_t type_attr) {
uint32_t handler_address = (uint32_t)handler;
idt[num].offset_low = handler_address & 0xFFFF;
idt[num].selector = 0x08;  // Code segment selector
idt[num].zero = 0;
idt[num].type_attr = type_attr;
idt[num].offset_high = (handler_address >> 16) & 0xFFFF;
}
// Initialize the IDT
internal void setup_idt() {
// Set the exception handlers
set_idt_entry(0x00, handle_divide_error, 0x8E); // Divide by Zero
set_idt_entry(0x06, handle_invalid_opcode, 0x8E); // Invalid Opcode
set_idt_entry(0x0E, handle_page_fault, 0x8E);    // Page Fault
}

// Load the IDT
internal void load_idt() {
struct IDTR {
uint16_t limit;
uint32_t base;
} __attribute__((packed)) idtr;

idtr.limit = sizeof(idt) - 1;
idtr.base = (uint32_t)&idt;

// Make sure the base address and limit are correct
if (idtr.base == 0 || idtr.limit == 0) {
// Print error or debug message here
while(1); // Halt if there's an invalid IDTR
}

__asm__ __volatile__("lidt (%0)" : : "r" (&idtr));
}
но он продолжает загружаться. Я не знаю, какая функция вызвала загрузочный цикл, но похоже, что при удалении до print_register (вниз вверх) ввод не работает.
Кроме того, если вам интересно, что означает внутренний, это означает внешний " С".

Подробнее здесь: https://stackoverflow.com/questions/792 ... dt-loading
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»