Почему загрузчики перемещаются в памяти? - PullRequest
5 голосов
/ 30 июля 2009

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

Может кто-нибудь объяснить это?

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

boot.s загружается в 0x7c00 подпрограммами запуска bios, перемещается с пути к адресу 0x90000 и переходит туда.

Ответы [ 3 ]

7 голосов
/ 30 июля 2009

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

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

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

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

"ПРИМЕЧАНИЕ! В настоящее время система не более 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)
3 голосов
/ 30 июля 2009

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

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

0 голосов
/ 30 июля 2009

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

...