【发布时间】:2019-06-03 16:06:48
【问题描述】:
我有一个这样的文件:
char* vidmem = (char*)0xb8000;
int main()
{
vidmem[0] = 'x';
vidmem[1] = 0x0f;
}
但是当我用 gcc 编译它时,它的行为就像 vidmem 甚至不存在一样。我在函数之外声明的所有变量都有这个问题。也许这个可以在 main 中声明,但其他文件中的其他变量则不能。 这就是我编译它的方式:
gcc -c main.c -o main.obj -ffreestanding -fno-exceptions -m64
这就是我组装所有文件的方式:
gcc -m64 -Wl,--build-id=none -static -fno-asynchronous-unwind-tables -nostdlib -nodefaultlibs -lgcc main.obj [..] -T linker.ld -o out.bin
为什么会这样?我该如何解决?
编辑:
我正在制作一个操作系统,这是来自 C 内核的代码。我正在使用 linux 子系统 for windows 来编译它和 qemu 进行测试
这里是所有代码的链接:http://www.mediafire.com/file/7x21lh4dnc93dz9/OS.7z/file
【问题讨论】:
-
“它的行为就像 vidmem 甚至不存在”怎么会?您看到的具体行为是什么?
-
volatile char* vidmem = (char*)0xb8000;怎么样? BTW,你的平台是什么?看起来您正在将其编译为裸机 -
@Mimmo 我希望屏幕左上角会打印一个“x” 为什么会这样?这是一个非常依赖于平台的期望,而您完全忽略了它。
-
您是否在 8086 PC 上运行 MS-DOS?
-
“它的行为就像 vidmem 甚至不存在” - 暗示你应该在
vidmem是一个未定义的符号时得到一个编译错误。