From Fedora Project Wiki

Обновление ядра Fedora системах с Arm

Обычно, при обновлении, достаточно через yum установить последний выпуск ядра Fedora. Однако, иногда необходимо собирать и устанавливать "собственные" ядра для отладки нового функционала.

Цель

Обновление ситем на ARM со "свеже собранным" ядро необходимо так, чтобы был доступ из uboot.

Это Пособие основано на опыте обновления trimslice устройствах. Однако, основные принципы вполне приминимы в других системах.

Сборка ядра из исходников

Получив архив, для сбрки следуйте инструкциям описанных в README.

  # cd linux-xxxxx     # or wherever you uinpacked the kernel to
  # make mrproper
  # cp/path/to/provided/config ./config
  # make oldconfig
  # make -j 6

конечно, возможно потребуется установить некоторые патчи перед фактичеким выполнением шагов сборки.

Следует обратить внимание, в примере выше конфигурационный файл идёт вместе с ядром. Если отсутствуют предварительные настройки, при выполнении команды 'make config', интерактивно, можно выбрать интиресующие опции из широкого списка или выполнить команду 'make arm_defconfig', чтобы сгенерировать конфигурация для ARM по-умолчанию.

Кроме того, вероятно, это наболее быстрый способ кросс-компиляции из, скажем, x86 исли имется доступный инструмент. Конечно, после сборки необходимо подготовить доступные исходники к установке на trimslice.

Установка ядра

Пользователем root в иходниках корневом каталоге:

 # make modules_install install

Этя команда должна переложить vmlinux и initramfs в /boot , /boot/uboot или туда где находятся скрипты и образы. Путь может отличаться в зависимости от конфигурации системы. Конечная деректория для установки, должна быть определена переменной UBOOT_DIR в /etc/sysconfig/uboot .

Генерация uImage и uInitrd образов требуемых UBoot

Далее необходимо сгенерировать файлы uInitrd (uboot initial ram disk) и uImage (uboot image) в конечной загрузочной директории. Можно так же указать подходящий суффикс,например как ниже armv7hl-tegra, если имеется другая архитектура.

  # cd /boot                     # or whatever UBOOT_DIR is
  # export VERSION=3.4.0-rc4     # or whatever the kernel version is
  # mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e
0x00008000 -n $VERSION -d ./vmlinuz-$VERSION uImage-$VERSION-armv7hl-tegra
  # mkimage -A arm -O linux -T ramdisk -C none -n $VERSION -d
./initramfs-$VERSION.img uInitrd-$VERSION-armv7hl-tegra

Продолжаем

Можно сохронить состояние кореневой системы на данный момент, на всякий случай.

Можно скопировать файлы uImage-$VERSION-armv7hl-tegra и uInitrd-$VERSION-armv7hl-tegra в одно место с boot.scr, т.к. они используются для загрузки (в примере это файлы uImage и uInitrd). Или пересобрать boot.scr с указанием на новые файлы.

Ядро 3.4.0 показанное здесь намного больше, чем используемое выше. Если это так, то возможно необходимо изменить используемы адрес загрузки в boot.cmd, для установки файлу uInitrd высшего внутреннего адреса. Пересобираем boot.scr используя команды:

  # mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Trim Slice
F17 boot script" -d boot.cmd boot.scr

На данный момент boot.cmd содержит следующее:

  setenv bootargs mem=384M@0M mem=512M@512M nvmem=128M@384M vmalloc=248M
video=tegrafb console=ttyS0,115200n8 rw root=/dev/sdb1 nohdparm rootwait
earlyprintk rd_NO_PLYMOUTH
  ext2load usb 0:1 4080000 /boot/uImage
  ext2load usb 0:1 4480000 /boot/uInitrd
  bootm 4080000 4480000

Will Cohen и Jon Masters рекомендуют менять 4480000 на 8400000. Всё что нужно, это убедиться, что размер файла uImage не перекрывает размер файла uInitrd:

  setenv bootargs mem=384M@0M mem=512M@512M nvmem=128M@384M vmalloc=248M
video=tegrafb console=ttyS0,115200n8 rw root=/dev/sdb1 nohdparm rootwait
earlyprintk rd_NO_PLYMOUTH
  ext2load usb 0:1 4080000 /boot/uImage
  ext2load usb 0:1 8400000 /boot/uInitrd
  bootm 4080000 8400000

Следует обратить внимание, на то чтобы не забыть прописать в boot.cmd корректно носители -- usb 0:1 в данном случае это USB-носитель, но можно так же определить карту памяти, диск или другой носитель. Проверить значение UBOOT_DEVICE в /etc/sysconfig/uboot которое должно совпадать с значением в boot.cmd/boot.scr

Хорошо, перезагружаем (скрестив руки :) и наслаждаемся!