簡體   English   中英

全局變量始終初始化為零

[英]global variable always initialized zero

我一直在使用教程編寫操作系統。 我在啟動加載程序完成的部分,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, target: x86_64 ),則會打印1234

我的問題是:我是否錯誤配置了gcc,這是我操作系統中的錯誤,這是一個已知問題嗎? 我找不到任何關於它的東西。

我的整個源代碼: 鏈接我使用以下命令編譯我的東西:

# ...
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部分。 所以你必須檢查bss部分偏移,對齊和大小與數據段和memset()它們為'0'。

在編寫操作系統時,可能所有庫例程都不可用,因此使用匯編更好地編寫memset()函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM