Как получить правильную инициализацию глобальной переменной в C? - PullRequest
0 голосов
/ 12 апреля 2020

Я сейчас пишу собственное ядро. Я заметил, что ни одна из моих объявленных глобальных переменных не инициализируется с правильными значениями. Вот пример:

#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.

1 Ответ

1 голос
/ 12 апреля 2020

Как обсуждалось в комментариях выше:

Вы используете свой собственный загрузчик. В нем вы указываете, сколько секторов должно быть загружено с диска. Если вы загружаете недостаточно секторов, возможно, что запущено только частичное ядро. Если вам повезет, не так много сбоев (как в вашей ситуации), так как раздел .text полностью скопирован. Если вам не повезло, вы попадаете в бутл oop. Точная проблема в том, что вы не загружаете раздел .data полностью с диска. Удачи в разработке вашего ядра: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...