Почему загрузчики перемещают в памяти?

Преимущество для выполнения этого, то, что возможно вытянуть только ответвление документов, если это - все, чем Вы интересуетесь. Как сказанный jrockway, можно сделать это использование другого репозитория и submoduling при необходимости, но с этой способностью создать 'явное' ответвление, у Вас есть опция не к.

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

5
задан icktoofay 14 November 2013 в 03:58
поделиться

3 ответа

Из статьи по ссылке:

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

3
ответ дан 13 December 2019 в 22:13
поделиться

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

0
ответ дан 13 December 2019 в 22:13
поделиться

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)
7
ответ дан 13 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: