2013-11-23 2 views
1

Я пытаюсь понять процесс сборки и загрузки ядра Linux для ARM. Я взял vanila linux с сайта www.kernel.org и построил его после запуска конфигурации для AT91SAM9260. В сообщении, когда мы скомпилировали ядро, было показано, что:Загрузка ядра Linux в AT91SAM9260

=================================== =======

LD vmlinux

SORTEX vmlinux

SYSMAP System.map

OBJCOPY арка/руки/загрузки/Image

Ядро: арка/рука/ботинок/Изображение готово

GZIP арка/руки/загрузки/сжатый/piggy.gzip

AS арка/рука/загрузки/сжатый/piggy.gzip.o

Л.Д. арка/рука/загрузки/сжатый/vmlinux

OBJCOPY арка/руки/загрузки/zImage

Ядро: арка/рука/загрузки/zImage готов

UIMAGE арка/руки/загрузки/uImage

Название изображения: Linux-3.9.1 +

Создано: Сб ноябрем 23 18:15:58 2013

Тип изображения: ARM Linux Kernel Image (несжатый)

Размер

данных: 1635544 байт = 1597,21 кБ = 1,56 MB

Нагрузка Адрес: 20008000

Точка входа: 20008000

аркой изображение/руки/загрузки/uImage повторно отовы

==========================================

Мои вопросы:

  1. Тип изображения распаковывается, это означает, что мы не сжимают vmlinux к zImage?

  2. Адрес загрузки: 20008000: это адрес декомпрессированного изображения = ZRELADDR, определенный в arch/arm/boot/Makefile? Этот адрес также является адресом ../arm/kernel/head.o? Кажется, что мы не используем адрес KERNEL_PHYS, этот метод является обычным способом или просто для семейства AT91SAM?

  3. В основном, наши процедуры для создания и загрузки являются:

а. построение шагов ядра: vmlinux -> uImage (пропустить для создания zImage).

b.шаги загрузки ядра: DataFlash/NAND - load -> uImage (@ 0x22200000) --- распаковать -> несжатое изображение (@ 0x20008000).

В этом случае нет процесса zImage при загрузке, хотя в сообщении сборки я увидел создание zImage. Я не прав ?

4. Как насчет адреса 0xC0008000, который я нашел в /arch/arm/kernel/vmlinux.lds по строке: . = 0xC0000000 + 0x00008000; Используем ли мы его? Я путаю этот адрес с ZRELADDR.

С уважением.

ответ

2
  1. Файл uImage, скорее всего, был построен с использованием zImage. Он говорит несжатый, потому что сам uImage не сжат.

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

  3. Вы правы о процессе загрузки. Но когда используется zImage, декомпрессия выполняется ядром вместо загрузчика. См. decompress_kernel()

  4. Адрес 0xc0008000 - это виртуальный адрес. Он отображает физический адрес 0x20008000. Виртуальные адреса могут использоваться только после того, как Linux настроит перенос памяти (MMU).

+0

Привет Christophe Ожье, В случае там zImage используется в процессе сборки, то процесс загрузки будет: ** uImage (DataFlash/NAND) ** --- load_to_RAM ---> ** uImage (@ 0x22200000) ** --- распаковать_uImage -> ** zImage (@ KERNEL_PHYS) ** --- распаковать_zImage ---> ** несжатое изображение (@ 0x20008000) **. Итак, где мы получаем ** KERNEL_PHYS **? Спасибо –

+0

Я думаю, что адрес KERNEL_PHYS выше должен быть «ZTEXTADDR». Из команды: bootm $ {kernel_addr}, u-boot-код будет un-package uImage из kernel_addr в ZTEXTADDR, но я не могу получить ZTEXTADDR в любом месте. –

+0

На самом деле я не думаю, что есть шаг распаковки_uImage. Как только uImage обрабатывается, его полезная нагрузка (ядро zImage) копируется на 0x22200000, а затем pc подпрыгивает по этому же адресу. Затем выполняется декомпрессия Linux, и окончательное изображение несжато в 0x20008000. –

Смежные вопросы