我有一个像这样的文件:
4, 5, 6 ,7
但是当我用gcc编译时,它的行为就像vidmem甚至不存在。我在函数外部声明的所有变量都有此问题。 Maby可以在main内部声明此变量,但不能在链接到此文件的其他文件中声明其他变量。 这是我的编译方式:
char* vidmem = (char*)0xb8000;
int main()
{
vidmem[0] = 'x';
vidmem[1] = 0x0f;
}
这就是我组装所有文件的方式:
gcc -c main.c -o main.obj -ffreestanding -fno-exceptions -m64
为什么会这样?而我该如何解决呢?
编辑:
我正在制作一个操作系统,这是来自C内核的代码。我正在使用Windows的Linux子系统对其进行编译,并使用qemu进行了测试
以下是所有代码的链接:http://www.mediafire.com/file/7x21lh4dnc93dz9/OS.7z/file
答案 0 :(得分:1)
您可以声明全局变量,但必须像这样在main内部进行初始化: char * vidmem;
char* vidmem;
int main()
{
vidmem = (char*)0xb8000;
vidmem[0] = 'x';
vidmem[1] = 0x0f;
}
答案 1 :(得分:-1)
我不明白为什么这个问题有很多反对票。这是一个完全有效和有趣的问题,我在1小时前遇到了同样的问题。
问题是,例如,在正常情况下,链接器生成在Linux上运行的可执行文件时,全局变量存储在.data节中,并且它们的值是可执行文件的一部分。现在,在您的方案中,您将生成原始二进制数据并直接将其引导。在这种情况下,您需要向链接器指定全局变量应在映像中存储的位置。例如,您可以通过-Tdata 0x6000
进行存储,以从地址0x6000开始存储它们。然后,在加载操作系统时,请确保在访问全局变量之前将映像的这一部分加载到内存中。