Я сейчас пишу собственное ядро. Я заметил, что ни одна из моих объявленных глобальных переменных не инициализируется с правильными значениями. Вот пример:
#include <tty.h>
#include <gdt.h>
#include <idt.h>
uint8_t name = 0x45;
void kernel_main() {
terminal_init();
terminal_clear();
terminal_write_string("\nWelcome to los kernel.\n\n");
terminal_write_string("(Kernel info) : TTY Loaded\n");
gdt_reload();
terminal_write_string("(Kernel info) : GDT installed\n");
idt_install();
terminal_write_string("(Kernel info) : IDT installed\n");
terminal_write_hex(name);
}
Ожидается, что в последней строке будет напечатано шестнадцатеричное «0x45», но я получу «0x0». То же самое происходит, когда я пытаюсь получить строку из глобального массива строк.
Вот мои флаги компиляции g cc -ffreestanding -m32 -fno-pie -Wall -Wextra -g -I$(KERNEL_INC_DIR) -masm=intel -std=gnu17
Что я могу сделать, пожалуйста? С уважением
Редактировать 1 То же самое происходит и здесь:
/* To print the message which defines every exception */
const char* _messages[] = {
"Division By Zero",
"Debug",
"Non Maskable Interrupt",
"Breakpoint",
"Into Detected Overflow",
"Out of Bounds",
"Invalid Opcode",
"No Coprocessor",
"Double Fault",
"Coprocessor Segment Overrun",
"Bad TSS",
"Segment Not Present",
"Stack Fault",
"General Protection Fault",
"Page Fault",
"Unknown Interrupt",
"Coprocessor Fault",
"Alignment Check",
"Machine Check",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved",
"Reserved"
};
void isr_handler(ISRStack stack) {
terminal_write_string("Interrupt ");
terminal_write_hex(stack.id);
terminal_write_string(" : ");
terminal_write_string(_messages[stack.id]);
terminal_write_string("\n");
// Hang if it is an exception
if (stack.id < 32) while (1);
}
Если я не поместил объявление массива _messages
в локальную область, он просто заполняется 0, когда я проверьте это с помощью GDB.