Почему я получаю неправильный адрес при обращении к глобальной переменной? - PullRequest
4 голосов
/ 26 марта 2020

Я пытаюсь написать основную 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.

1 Ответ

0 голосов
/ 27 марта 2020

Почему ссылка на переменную возвращает адрес, отличный от того, где переменная хранится в памяти? Это не. Я сильно подозреваю, что то, что отображает GDB, не то, что вы думаете, что оно отображает (хотя я не эксперт GDB).

Предполагая, что вы разрабатываете это в системе linux, я предлагаю дополнить ваши наблюдения вывод 'nm' (или относительный кросс-компилятор).

nm -n <elf file>

Это надежно даст вам список всех символов в вашем ядре / ОС и их адреса (отсортированные по порядку номеров). Затем сравните адреса 'idtEntries' и 'entry' с тем, что вы получили в GDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...