我正在尝试编写一个基础操作系统来更好地理解操作系统的基本原理,但我遇到了奇怪的问题。在切换到保护模式后,我跳转到我的内核。在我的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模拟器运行此程序。
idtPtr
和idtEntries
的声明顺序会发生什么? - markoentry
和在 gdb 中查看它之间是否更改了它?提供一个 [mcve] 会有帮助。 - dbush