当引用全局变量时为什么会得到错误的地址?

4

我正在尝试编写一个基础操作系统来更好地理解操作系统的基本原理,但我遇到了奇怪的问题。在切换到保护模式后,我跳转到我的内核。在我的kernel.cpp文件中,我声明了以下全局变量(其中IdtPointer_t和IdtEntry_t都是结构体)。

IdtPointer_t idtPtr;
IdtEntry_t idtEntries[256];

这将在bss段中创建idtPtr和idtEntries变量。然后,在我的代码中稍后执行以下操作:

IdtEntry_t* entry = &idtEntries[0];

&idtEntries[0]返回的值不是正确的地址。 我使用GDB进行了以下操作:

p &idtEntries[0]
(IdtEntry_t *) 0x87a0 <idtEntries>
p entry
(IdtEntry_t *) 0x87e0 <idtEntries+64>

这两个变量的位置相差64字节。为什么引用变量返回的地址与变量在内存中存储的位置不同?

另外,我正在使用qemu i386模拟器运行此程序。


如果您更改idtPtridtEntries的声明顺序会发生什么? - marko
2
你在初始化 entry 和在 gdb 中查看它之间是否更改了它?提供一个 [mcve] 会有帮助。 - dbush
1
GDB 是否可能会因为您启用了编译优化而错误地报告此问题? - marko
这些代码行在同一编译单元中吗? - Artyer
1
如果你在代码中打印这些变量,你会得到什么? - Paul Sanders
1个回答

0
为什么引用变量返回的地址与变量在内存中存储的位置不同?实际上并不是这样的。我强烈怀疑GDB显示的内容并非您所认为的(尽管我不是GDB专家)。
假设您正在Linux系统上开发此程序,我建议您使用“nm”命令(或其交叉编译器相关命令)来补充您的观察结果。
nm -n <elf file>

这将可靠地为您提供内核/操作系统中所有符号及其地址的列表(按数字顺序排序)。然后将'idtEntries'和'entry'的地址与在GDB中获得的内容进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接