5. Загрузка образа ядра

Предыдущая  Содержание  Следующая V*D*V

Образами ядра, генерируемыми процессом сборки ядра, являются либо файл без сжатия "Image", либо сжатый файл zImage.

 

Несжатый образ Image, как правило, не используется, так как он не содержит легко идентифицирумое магическое число. Практически повсеместно предпочтение отдаётся использованию сжатого формата zImage.

 

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

 

zImage имеет в своём начале магическое число и некоторую полезную информацию.

 

Таблица 2. Используемые поля в заголовочном коде zImage

 

Смещение в zImage

Значение

Описание

0x24

0x016F2818

Магическое число, используемое для идентификации этого zImage Linux для ARM

0x28

начальный адрес

Адрес, где zImage начинается

0x2C

конечный адрес

Адрес, где zImage заканчивается

 

Смещения начала и конца могут быть использованы для определения длины сжатого изображения (размер = конец - начало). Это используется некоторыми загрузчиками, чтобы определить, были ли добавлены в образ ядра какие-либо данные. Эти данные обычно используются для первоначального RAM диска RAM (initrd). Начальный адрес, как правило, 0, так как код zImage позиционируется независимо.

 

Код zImage является позиционно-независимым кодом (Position Independent Code, PIC), поэтому может быть загружен куда угодно в пределах имеющегося адресного пространства. Максимальный размер ядра после распаковки 4 мегабайта. Это жёсткое ограничение и будет включать initrd, если была использована цель bootpImage.

 

Примечание

Хотя zImage может быть расположен в любом месте, следует позаботиться об этом. Старт сжатого ядра требует дополнительной памяти для распаковки образа. Это пространство имеет определённые ограничения.

 

Код декомпрессии zImage гарантирует, что скомпрессированные данные не будут перезаписаны. Если ядро обнаруживает такой конфликт, оно будет распаковывать образ сразу после сжатых данных zImage и перенесёт ядро после декомпрессии. Это, очевидно, имеет последствия, что после области памяти загрузки zImage должно быть до 4 мегабайт свободного места после него (максимальный размер несжатого ядра), то есть размещение zImage в том же 4-х мегабайтном банке, как и ZRELADDR, будет, вероятно, не работать, как ожидалось.

 

Несмотря на возможность разместить zImage в любом месте памяти, традиционно оно загружается по базовому адресу физической памяти плюс смещение 0x8000 (32K). Это оставляет пространство для блока параметров, обычно размещённого со смещением 0x100, нулевой страницы векторов исключений и таблиц страниц. Это соглашение является очень распространённым.

 

Предыдущая  Содержание  Следующая