Kernel compilation

Материал из Toshiba AC100 wiki
Перейти к: навигация, поиск

Часть первая(и самая важная). Подготовка.

Предположим, что мы используем Ubuntu 11.04 (если это не так, то посмотреть, как настроить компилятор можно на странице Кросс компилятор). Первым делом откроем эмулятор терминала, и перейдем в режим суперпользователя:

$ sudo su

Далее обновим имеющиеся в системе пакеты и установим необходимые.

# apt-get update
# apt-get upgrade
# apt-get install git gcc-arm-linux-gnueabi

Часть вторая(и самая долгая). Получение исходников, конфигурирование и сборка.

$ git close https://github.com/torvalds/linux.git
$ cd linux

Для старых ядер нужно брать другой репозиторий

# 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

Собираем ядро (если хотите собрать быстрее, то в первой команде нужно в конец добавить -j4, где вместо 4 нужно подставить количество ядер процессора)

# 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="[email protected] 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

Относится к linux-next, 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.