LINUX.ORG.RU

особенности загрузки linux


0

0

всем доброго времени суток.

начну издалека. как известно, ядро линукс(более конкретно - файл bzImage) разделён на три виртуальных части: "lower part", "middle part" и "higher part", где "lower part" - загрузчик, сидящий на 0x55AA

"middle part" - ассемблерные файлики head.S, setup.S и иже с ними. короче говоря всё то, что поднимает систему на нижнем уровне. сиит по адресу 0x100000

"higher part" - как понятно из названия, фактически, "верхушка ядра" или. если выражаться сильнее, само ядро . сидит по адресу 0xC0000000

непонятно следующее: зачем вообще так жёстко разделять "middle part" и "higher part"? какие преимущества даёт такой подход? почему не использован банальный линкинг виртуального адреса на физический. вида:

/* ... */

.text 0xC0000000 : AT (0x100000)

{

*(.text);

}

/* .. */

более того, на сколько мне известно, в ветке 2.4 не происходило жёсткого разделения, а использовалась описанная выше линковка. соответсвенно paging'и включались фактически в самом начале head.S. (соответсвенно до их енаблинга использовалась фейковая gdt).

в ветке 2.6(а может это началось уже в 2.5) перешли на систему жёсткого разделения по адресам, убрав линковку. очень хочется понять - зачем. неужели только для того, чтобы включать пейджинги в конце setup_arch() и инитить gdt не 2, а один раз?

спасибо за внимание.

anonymous

Да,загрузка ядра довольно прихотлива.
Сначала был zimage
Ядру на все про все дается 640 килобайт,с помощью которых он грузится в несколько приемов.
Сначала код,лежащий в bootsect.S,грузится 0x90000
Затем код,лежащий в setup.S, грузится в 0x90200
Затем сжатое ядро перемещается с 0x10000 (64K) в 0x1000 (4K),это кстати приводит к затиранию биоса
Затем код,лежащий в head.S, распаковывает ядро и ложит его начиная с адреса 0x100000 (1MB)
Дальше прыгаем в start_kernel() - head.S - по адресу 0x100000 - и понеслася

Потом появился big zimage
bzImage кстати появился начиная с версии 1.3.73.
Сжатое ядро здесь не копируется с 0x10000 (64K) в 0x1000 (4K)
Оно прямо с адреса 0x100000 разархивируется довольно интересно -
одна часть ниже себя и вторая - выше себя в память
Потом эти 2 куска копируются опять в 0x100000 ,насколько я не понял :-)

kto_tama ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.