gpt4 book ai didi

c - 全局变量始终初始化为零

转载 作者:太空狗 更新时间:2023-10-29 17:13:31 25 4
gpt4 key购买 nike

我一直在使用 this 编写操作系统教程。我在那个地方引导加载程序完成,C 用于编程(然后链接在一起......)。但这只是一个说明,我相信我遇到的问题与 gcc 有关。

我为操作系统构建了一个i386-elf 交叉编译器。一切正常,我可以执行我的代码一切正常。除了所有全局变量都初始化为零,虽然我提供了一个默认值

int test_var = 1234;

// yes, void main() is correct (the boot-loader will call this)
void main() {}

如果我用 GDB 调试这段代码,我得到:(gcc-7.1.0, target: i328-elf)

(gdb) b main
Breakpoint 1 at 0x1554: file src/kernel/main.c, line 11.
(gdb) c
Continuing.

Breakpoint 1, main () at src/kernel/main.c:11
11 void main() {
(gdb) p test_var
$1 = 0

如果我在我的本地机器上运行相同的代码(gcc-6.3.0,目标:x86_64),它会打印1234

我的问题是:我是否错误配置了 gcc,这是我的操作系统中的一个错误,这是一个已知问题吗?我找不到任何相关信息。

我的整个源代码:link我使用以下命令来编译我的东西:

# ...
i386-elf-gcc -g -ffreestanding -Iinclude/ -c src/kernel/main.c -o out/kernel/main.o
# ...
i386-elf-ld -e 0x1000 -Ttext 0x1000 -o out/kernel.elf out/kernel_entry.o out/kernel/main.o # some other stuff ...
i386-elf-objcopy -O binary out/kernel.elf out/kernel.bin
cat out/boot.bin out/kernel.bin > out/os.bin
qemu-system-i386 -drive "format=raw,file=out/os.bin"

编辑:作为@EugeneSh。在这里建议一些逻辑来确保它没有被删除:

#include <cpu/types.h>
#include <cpu/isr.h>

#include <kernel/print.h>

#include <driver/vga.h>

int test_var = 1234;

void main() {
vga_text_init();

switch (test_var) {
case 1234: print("That's correct"); break;
case 0: print("It's zero"); break;

// I don't have a method like atoi() in place, I would use
// GDB to get the value
default: print("It's something else");
}
}

遗憾的是它打印出It's zero

最佳答案

编译器永远不会将未初始化的全局变量清零,它的逻辑内置在加载器中,因此,当您为数据段分配内存时,它的大小也包含 bss 部分。因此,您必须使用数据段和 memset() 检查 bss 部分偏移量、对齐方式和大小,并将它们设置为“0”。

在编写操作系统时,可能所有库例程都不可用,因此最好使用汇编编写 memset() 函数。

关于c - 全局变量始终初始化为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45286875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com