всем доброго времени суток.
начну издалека. как известно, ядро линукс(более конкретно - файл 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, а один раз?
спасибо за внимание.