gpt4 book ai didi

c++ - 为什么在引用全局变量时会得到错误的地址?

转载 作者:行者123 更新时间:2023-12-01 14:08:22 24 4
gpt4 key购买 nike

我正在尝试编写一个基本的操作系统来更好地理解操作系统的基础知识,但我遇到了一个奇怪的问题。切换到保护模式后,我跳转到我的内核。在我的 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 模拟器运行它。

最佳答案

为什么引用变量返回的地址与变量存储在内存中的地址不同?它不是。我强烈怀疑 GDB 显示的内容并不是您认为它显示的内容(尽管我不是 GDB 专家)。

假设您是在 linux 系统上开发它,我建议用 'nm' 的输出(或者它是交叉编译器相关的)来补充您的观察结果。

nm -n <elf file>

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

关于c++ - 为什么在引用全局变量时会得到错误的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60858396/

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