我正在尝试从头开始创建一个内核(只是尝试一些新的东西)
现在一切都准备好了,我正在测试输出并注意到一些非常奇怪的东西
我构建我的文件:
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部分
#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 数组在内存中,但我没有引用 init() -> 所以print
永远不会被调用。
如果我现在使用注释文本(和注释print("Test")
)一切正常,文本会以我想要的方式打印。
但真正的问题是:是否有某种“技巧”告诉编译器除了使用 volatile 之外不要优化此代码?因为我不认为清除所有可能被打印为易失性的东西是我应该这样做的方式。
据我了解,主要问题是该print
函数基本上什么都不做,因为编译器似乎不知道 0xb8000 是一个有点……特殊的地址。