Kernel compilation
Часть первая(и самая важная). Подготовка.
Предположим, что мы используем Ubuntu 11.04 (если это не так, то посмотреть, как настроить компилятор можно на странице Кросс компилятор). Первым делом откроем эмулятор терминала, и перейдем в режим суперпользователя:
$ sudo su
Далее обновим имеющиеся в системе пакеты и установим необходимые.
# apt-get update # apt-get upgrade # apt-get install git gcc-arm-linux-gnueabi
Часть вторая(и самая долгая). Получение исходников, конфигурирование и сборка.
# git clone git://gitorious.org/~marvin24/ac100/marvin24s-kernel.git # cd marvin24s-kernel
Переключаемся на актуальную версию ядра
# git checkout -b l4t-r16-r2-ac100 origin/l4t-r16-r2-ac100
Небольшая справка по использованию git для выбора нужной ветки и их краткое описание(todo): git branch -r = отобразить все ветви репозитория. git checkout <имя ветви> = переключиться на определенную ветвь. git show HEAD = отобразить содержимое последнего коммита активной ветви.
После первой комманды мы можем пойти на кухню, выпить кружку теплого молока и съесть пару печенек. А потом вновь приняться за дело. Сначала выбираем конфигурацию. Для 3.1 paz00_defconfig:
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- paz00_defconfig
для 3.10 и старше - tegra_defconfig:
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tegra_defconfig
Собираем
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- # mkdir -p modules_install/lib/firmware # make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- \ modules_install INSTALL_MOD_PATH=./modules_install # make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- \ firmware_install INSTALL_MOD_PATH=./modules_install
Замечание: для ядер, которые используют device tree (например, 3.8 или 3.10), нужно dtb файл добавить к zImage или грузить отдельно (см. описание device tree)
На данном этапе мы уже можем положить модули и прошивки на карточку с рутфс.
# cp -r ./modules_install/lib/* /mnt/usbflash/lib/*
(вместо mnt/usbflash — конкретный каталог в который смонтирована карта/флеш с rootfs) Никто не запрещает сделать это через тот же Nautilus, для наглядности.
Часть третья (и самая-самая). Заворачиваем ядро в загрузочный образ.
Замечание: помимо mkbootimg из пакета nvflash можно использовать abootimg. Тут есть один (и более) пунктов на которые необходимо обратить внимание: Если мы планируем загружать rootfs c флешки нашим root в cmdline будет /dev/sda1 Если с SD карты - то mmcblk1p1. В зависимости от этого необходимо редактировать (или напротив) следующую строку с параметрами загрузки ядра (не самая актуальная строка, более подробно расписано на странице cmdline).
# export CMD_LINE="mem=512M@0M console=tty1 root=/dev/mmcblk1p1 rootwait rootfstype=ext4"
Экстренно скачиваем программу для создания загрузочного образа и даем ей права для запуска:
# wget http://zen-droid.googlecode.com/files/mkbootimg # chmod +x mkbootimg
Ну и завершаем все это дело созданием образа. (в home/user вместо user = имя вашего пользователя) <range type="comment" id="386620390_1">Ахтунг для юзеров 64 битных дебианов и быть может убунт минтов и прочих. Если mkbootimg не запустится - это значит что ему не хватает 32 битных библиотек.</range id="386620390_1"> Для их получения делаем следующее: sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install ia32-libs libc6-dev-i386 если чего то не будет то добавьте в source.list sid'овские репы.
#./mkbootimg --kernel /home/user/marvin24s-kernel/arch/arm/boot/zImage \ --ramdisk NONE --cmdline "$CMD_LINE" -o MyNewBootImage.img
Теперь в папке marvin24s-kernel вы можете найти MyNewBootImage.img который можно будет зашить в выбранный вами раздел. Но это уже совсем другая история.
Дополненительные материалы
Извлечение конфига из бинарной сборки ядра
Иногда есть необходимость достать конфиг из чужого уже собранного ядра, есть конечно вариант запустить его и считать файл /proc/config.gz но это долго, быстрее сразу считать конфиг из файла zImage от уже собранного ядра, сделать это можно следующим образом
$ cd any-kernel-source-root $ scripts/extract-ikconfig any-kernel-binary-path/zImage > .config
Сравнение двух веток исходников
Чтобы получить patch файл сравнения двух веток исходников можно воспользоваться следующей коммандой
$ diff -Naur any-kernel-source-tree-1 any-kernel-source-tree-2 > kernel-1-vs-kernel-2.patch
Device tree
Относится к<range type="comment" id="18021"> linux-next</range id="18021">, 3.8, 3.10, ... Сборка device tree
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs
Далее нужно его добавить к ядру
cat arch/arm/boot/dts/tegra20-paz00.dtb >> arch/arm/boot/zImage
или, при использовании u-boot'а, загружать в память и передавать третьим параметром в команду bootz.