Итак, я создал базовый 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 (вниз вверх) ввод не работает.
Кроме того, если вам интересно, что означает внутренний, это означает внешний " С".
Итак, я создал базовый IDT для своей собственной ОС на C++, но он продолжает загружаться. gcc вообще не выдает никаких результатов или ошибок, поэтому я не могу найти проблему. IDT приведен ниже: [code] // Define the IDT entry structure
// 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*);
// 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)); } [/code] но он продолжает загружаться. Я не знаю, какая функция вызвала загрузочный цикл, но похоже, что при удалении до print_register (вниз вверх) ввод не работает. Кроме того, если вам интересно, что означает внутренний, это означает внешний " С".