因此,我对操作系统有了一些了解,并且按照here所述构建了引导加载程序和内核条目之后,我遇到了一些奇怪的行为。
考虑这段代码
#define VIDEO_ADDRESS 0xb8000
unsigned char* vidmem = (unsigned char*) VIDEO_ADDRESS;
int p = 0;
现在,如果我这样做
*(vidmem + 0) = 0x30;
它应该在左上角打印0
,但是如果我这样做的话
*(vidmem + p) = 0x30;
将它打印在其他地方!
我尝试更改p
的类型,看来使用int
会导致0
被打印在其他位置(看起来完全无关)。如果我使用unsigned
的任何其他变体和任何其他类型(char,long,int,short),那么我需要设置p = 1
以便将0
打印在左上角角落(减去1吗?)。
我不明白这里发生了什么,将不胜感激。
这是完整的代码
//kernel.c
#define VIDEO_ADDRESS 0xb8000
int main() {
unsigned char* vidmem = (unsigned char*) VIDEO_ADDRESS;
int p = 0;
*(vidmem + p) = 0x30;
}
这是我编译C文件的方式
gcc -ffreestanding -c screen.c -o screen.o
我正在使用qemu运行代码(不确定是否与此有关)
更新:
如果我改用GRUB,它会按预期工作。
答案 0 :(得分:0)
这可能不是答案,但是我需要格式化代码。
要调试,请尝试:
#define VIDEO_ADDRESS 0xb8000
int main() {
int p = 0;
unsigned char* vidmem = (unsigned char*) VIDEO_ADDRESS + p;
*vidmem = 0x30;
}
这可能证明Antti Haapala的怀疑。
我还恳求检查生成的汇编程序,如果您的平台上有调试器,则可以将其步进到调试器中并检查寄存器和内存位置。