entry () попасть на другой адрес из точки входа, которую я установил в Elf

Недавно узнал про ОС. И я хочу написать простой загрузчик, который изменяет реальный режим на защищенный режим, а затем загружает простое ядро.
Но я не могу понять проблему адреса входа.
Сначала я поместил загрузчик в первый сектор OS.img (qemu), а затем ядро ​​начинается со второго сектора.
Вот результат моего ядра:  введите здесь описание изображения
Адрес точки входа - 0x800c.
LMA и VMA указаны ниже:
 введите описание изображения здесь
Часть загрузчика, которая читает ядро ​​типа elf и затем попадает в запись (), которая является адресом точки входа.
введите описание изображения здесь
Однако, когда я разбираю загрузчик, запись () находится ниже: введите описание изображения здесь
Звоните * 0x8018, а не * 0x800c.
Я не знаю, почему это случилось п. Не могли бы вы мне помочь?


person KUN    schedule 29.04.2012    source источник
comment
Пожалуйста, предоставьте текст вместо изображений.   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 14.07.2015


Ответы (1)


call *0x8018 выполняет вызов адреса, который хранится в 0x8018, это правильно, поскольку ELFHDR равно 0x8000, а смещение e_entry в заголовке равно 0x18.

Настоящая проблема заключается в том, как вы загружаете сегменты в память. Каждый сегмент должен быть загружен по адресу p_vaddr из смещения файла p_offset. Обратите внимание, что в вашем случае p_vaddr это 0x8000, это то же самое место в памяти, в которое вы загрузили заголовок elf, и поэтому ELFHDR->e_entry перезаписывается. Самым простым решением было бы загрузить заголовок elf по другому адресу.

Источник: http://www.skyfree.org/linux/references/ELF_Format.pdf

person Paweł Dziepak    schedule 29.04.2012
comment
С asm-кодом загрузчика проблем нет. Сгенерирован правильно. Как я уже сказал, значение ELFHDR->e_entry хранится по адресу 0x8018. Вот почему вызывается функция, адрес которой хранится в 0x8018, что и делает call *0x8018. (Обратите внимание, что это call *0x8018, а не call 0x8018). - person Paweł Dziepak; 07.05.2012