Я пытаюсь создать ядро с нуля (просто пробую что-то новое)
Теперь все готово, я тестирую вывод и заметил что-то очень странное
Я строю свой файлы с:
gcc ./kernel/kernel.c -ffreestanding -O0 -m32 -c -o./bin/kernel.o -fno-pie
и связать их вместе с:
ld -nostdlib -nodefaultlibs -Tlink.ld ./bin/kernel_ep.elf.bin ./bin/kernel.o -o ./bin/kernel.bin
Итак, насколько я понимаю, я уже говорю компилятору НЕ оптимизировать мой код.
Теперь C part
#define BYTE unsigned char
#define VIDMEM ((BYTE*)0xb8000)
void init();
void main() {
init();
while(1);
}
void print(char *msg)
{
volatile BYTE *screen = VIDMEM;
for(const char *msgPtr = msg; *msgPtr; ++msgPtr)
{
*(screen++) = *msgPtr;
screen++;
}
}
void init() {
//volatile char test[] = "Test";
//print(test);
print("Test");
}
Если я выполню это, ничего не произойдет, я проверил все это в ghidra - массив char "Test" находится в памяти, но у меня нет ссылки на init () -> Так что print
никогда не вызывается.
Если я сейчас использую закомментированный текст (и комментарий print("Test")
), все работает нормально, текст печатается так, как я хочу.
Но реальный вопрос: есть ли какая-то «хитрость», чтобы сказать компилятору НЕ оптимизировать этот код, кроме использования volatile? потому что я не думаю, что объявление всего, что может быть напечатано как изменчивое, - это то, как я должен это делать.
Насколько я понимаю, главная проблема в том, что функция print
в основном ничего не делает, потому что кажется, компилятор не знает, что 0xb8000 - это своего рода ... особый адрес.