Я пытаюсь написать основную c ОС, чтобы лучше понять основы ОС, и столкнулся со странной проблемой. После перехода в защищенный режим я прыгаю в свое ядро. В моем файле ядра. cpp я объявляю следующие глобальные переменные (где IdtPointer_t и IdtEntry_t являются структурами.)
IdtPointer_t idtPtr;
IdtEntry_t idtEntries[256];
Это создает переменные idtPtr и idtEntries в секции bss. Затем в моем коде, когда я делаю следующее
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.