Недавно узнал про ОС. И я хочу написать простой загрузчик, который изменяет реальный режим на защищенный режим, а затем загружает простое ядро.
Но я не могу понять проблему адреса входа.
Сначала я поместил загрузчик в первый сектор OS.img (qemu), а затем ядро начинается со второго сектора.
Вот результат моего ядра:
Адрес точки входа - 0x800c.
LMA и VMA указаны ниже:
Часть загрузчика, которая читает ядро типа elf и затем попадает в запись (), которая является адресом точки входа.
Однако, когда я разбираю загрузчик, запись () находится ниже:
Звоните * 0x8018, а не * 0x800c.
Я не знаю, почему это случилось п. Не могли бы вы мне помочь?
entry () попасть на другой адрес из точки входа, которую я установил в Elf
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
С asm-кодом загрузчика проблем нет. Сгенерирован правильно. Как я уже сказал, значение
ELFHDR->e_entry
хранится по адресу 0x8018
. Вот почему вызывается функция, адрес которой хранится в 0x8018
, что и делает call *0x8018
. (Обратите внимание, что это call *0x8018
, а не call 0x8018
).
- person Paweł Dziepak; 07.05.2012