Я пишу свое собственное ядро (используя multiboot2) и следую этому руководству , чтобы перевести его в long-mode. Теперь я связываюсь со следующим C кодом:
void kernel_main()
{
*(uint64_t*) 0xb8000 = 0x2f592f412f4b2f4f;
}
Это выводит OKAY
на экран.
Однако теперь я создаю глобальную переменную с именем VGA_buffer
, которая содержит этот адрес памяти.
volatile static const void* VGA_buffer = 0xb8000;
void kernel_main()
{
*(uint64_t*) VGA_buffer = 0x2f592f412f4b2f4f;
}
Код больше не работает, OKAY
не появляется на экране.
Как это исправить?
Я думаю это потому, что мой скрипт компоновщика не включает данные глобальных переменных. Вот что у меня есть:
ENTRY(start)
SECTIONS
{
. = 1M;
.boot :
{
*(.multiboot_header)
}
.text :
{
*(.text)
}
}
Я также безуспешно пытался добавить следующее:
...
.rodata :
{
*(.rodata)
}
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
Я не очень знаком с пользовательскими скриптами компоновщика, поэтому я действительно не знаю, что я делаю, и я не уверен, что это даже проблема.