2009-07-29 13 views
4

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

Может ли это объяснить это?

Примером такого поведения является original v0.01 Linux kernel bootloader, который имеет следующий комментарий в нем:

boot.S загружается в 0x7c00 с помощью подпрограмм BIOS-запуска, и перемещает себя из пути для решения 0x90000 , и прыгает там.

ответ

3

Из связанной статьи:

На практике, как правило, содержит MBR загрузчика, цель которого заключается в загрузку другого загрузчика - можно найти в начале одного из разделов. Это часто очень простая программа, которая находит первый раздел, помеченный как «Актив», загружает первый сектор в ОЗУ и начинает его выполнение. Поскольку по соглашению новый загрузчик также загружается в адрес 7C00h, перед тем, как это сделать, для старого загрузчика может потребоваться переместить все или часть себя в другое место. Кроме того, ожидается, что ES: SI будет содержать адрес в ОЗУ таблицы разделов, а DL - номер загрузочного диска. Нарушение таких соглашений может привести к тому, что загрузчик несовместим с другими загрузчиками.

+1

Но он специально спрашивает об Linux v0.01 в нижней части этой страницы, что делает __not__ как двухступенчатый загрузчик. Кажется, загружает ядро ​​прямо в 0x10000, как комментарий в верхних состояниях. – IRBMe

+0

Спасибо, прекрасный ответ! Я понял, что приложения соединены вместе, но мне не пришло в голову, что все остальные будут загружены по тому же адресу. Я заметил, что регистр DL используется для идентификации номера диска, но снова я не мог найти никакой явной документации об этом. Я не думаю, что есть стандартный справочный документ BIOS, плавающий вокруг межсетевых экранов? Раньше у меня была книга, содержащая таблицы прерываний, но ее, по крайней мере, 20 лет и, вероятно, очень устаревшие (и потерянные). – icStatic

+1

Вот список прерываний BIOS: http://en.wikipedia.org/wiki/BIOS_interrupt_call. Очевидно, что они доступны только до тех пор, пока ваша ОС не установит таблицу прерываний. – Falaina

6

CookieOfFortune по существу правильный (потому что он хотел что-то переместить в место, где был начальный загрузчик), но это был не второй загрузчик, а скорее ядро.

Из его комментариев:

Он загружает систему на 0x10000, с использованием прерываний BIOS. После этого он отключает все прерывания, перемещает систему до 0x0000, переходит в защищенный режим и вызывает начало системы . Затем система должна RE-инициализировать защищенный режим в собственных таблицах и разрешать по необходимости прерывания.

Он хочет, чтобы ядро ​​будет находиться в 0x0000 ... 0xKERNEL_SIZE-1, однако начальный загрузчик в настоящее время 0x7C00, поэтому если ядро ​​было более ~ 32 КБ было бы перезаписать загрузчик, как это движущееся его , Дело в том, что ядро ​​находится в 0x0000 также объясняет этот комментарий:

«NOTE В настоящее время система находится в наиболее 8 * 65536 байт долго!».

Если он был больше 512 КБ, начиная с 0, это может привести к поломке зарезервированной области адресного пространства x86.

Я считаю, что этот раздел кода содержит фактический переход в ядро ​​

mov ax,#0x0001 | protected mode (PE) bit 
lmsw ax  | This is it! 
jmpi 0,8  | jmp offset 0 of segment 8 (cs) 
0

Иногда загрузчик находится в ПЗУ, и должен быть скопирован в RAM в какой-то момент.

+0

Загрузочный загрузчик, безусловно, не в ПЗУ. BIOS может быть, хотя ... – bdonlan

+0

Я использовал загрузчик, который начинался в ПЗУ. Сожалею. =) –

+0

Хорошо, ну, обычно это не так :) – bdonlan

 Смежные вопросы

  • Нет связанных вопросов^_^