разработка и программирование электронных устройств

Сборка ядра Linux для Raspberry Pi 3

Первым делом попробуем разобраться в том, зачем заново собирать ядро Linux в работающей системе. Дело в том, что ядро операционной системы Linux является монолитным, то есть состоит из одного исполняемого бинарного образа (как прошивка для микроконтроллера). Кроме того в архитектуре ядра реализована поддержка так называемых модулей ядра,- исполняемых бинарных образов, которые могут быть загружены в процессе работы. С помощью модулей ядра реализована поддержка драйверов для различного периферийного оборудования. Во время сборки ядра также производится сборка модулей ядра. Следовательно ядро нужно собирать, чтобы убрать драйвера не используемого оборудования или добавить поддержку нового оборудования.

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

На официальном сайте Raspberry Pi описана сборка ядра с помощью кросс-компиляции в операционной системе Ubuntu. Ядро можно собрать и непоcредственно на самой плате Raspberry Pi, но этот процесс может занять гораздо больше времени, чем при кросс-компиляции на большой Linux-машине.
Я буду использовать для сборки ядра компьютер с установленной операционной системой Fedora Linux.

Начнем сборку ядра с загрузки исходников. Проверить наличие в системе установленной утилиты git можно с помощью команды :

1
$git --version

Если git не установлен , то установить его можно с помощью команды :

1
#dnf install -y git

Установку новых пакетов, естественно, можно производить только с правами root :

1
2
$su
<Password>

Вернуть себе свои права (пользователя) можно с помощью команды :

1
#exit

Загружаем исходники ядра :

1
$git clone --depth=1 https://github.com/raspberrypi/linux

Имейте ввиду, что исходники будут загружены в тот каталог, на котором вы будете находится в момент выполнения команды загрузки исходников из репозитория. Это может быть домашний каталог пользователя. Я создал для этой цели в своем домашнем каталоге подкаталог raspberrypi.
После выполнения команды исходный код ядра Linux будет расположен в /home/{Username}/raspberrypi/linux.

Переместимся в этот каталог и выполним конфигурирование ядра :

1
2
$cd
$cd raspberrypi/linux

Для конфигурирования ядра будем использовать утилиту menuconfig , ее также нужно будет собрать. Для использования menuconfig в вашей системе Fedora Linux должен быть установлен пакет ncurses-devel :

1
#dnf install -y ncurses-devel

Перед сборкой также необходимо убедиться в наличии установленного кросс-компилятора с помощью команды :

1
$arm-linux-gnueabihf-gcc --version

Загрузить инструментальные средства можно по команде :

1
$git clone https://github.com/raspberrypi/tools

Теперь соберем menuconfig :

1
2
3
4
5
$cd 
$cd raspberrypi/linux
$KERNEL=kernel7
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
$make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

После выполнения последней команды на экране сразу же появиться запущенная утилита menuconfig. Выберите необходимые вам опции (или ничего не выбирайте, если просто хотите попробовать конфигурирование) с помощью перемещения курсора по меню. К примеру, для добавление в ядро поддержки расширителя портов GPIO через I2C-интерфейс на основе микросхемы MAX7300 необходимо выбрать пункт меню :
Device Drivers — GPIO Support — I2C GPIO expanders — Maxim MAX7300 GPIO expander

После выбора соответсвующего пункта меню (нажатием клавиши “y”) необходимо сохранить изменения в файле .config , нажав на кнопку “Save”.
Конфигурирование выполнено, теперь можно приступить к сборке :

1
$make -j2 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

Наверное стоит акцентировать ваше внимание на некоторых параметрах в командной строке утилиты make для лучшего понимания происходящего.

Опция -j2 указывает make выполнять одновременно 2 задания, благодаря этому процесс сборки будет происходить быстрее.
zImage — цель для сборки ядра (одноименная с названием образа ядра).
modules — цель для сборки модулей ядра.
dtbs — цель для сборки дерева устройств (дерево устройств используется для загрузки драйверов, выбранных по-умолчанию).

Теперь необходимо скопировать собранное ядро на карту памяти microSD с предварительно установленной операционной системой Raspbian, последнюю версию которой можно загрузить с официального сайта. Там же рекомендуют использовать для записи образа системы на карту памяти утилиту с графическим интрефейсом Etcher.

Просмотреть названия подключенных дисков (в том числе карты памяти microSD) можно с помощью команды :

1
$lsblk

Дальше необходимо создать точки монтирования и примонтировать разделы карты памяти к файловой системе :

1
2
3
4
#mkdir /mnt/fat32
#mkdir /mnt/ext4
#mount /dev/sdc1 /mnt/fat32
#mount /dev/sdc2 /mnt/ext4

Монтирование производиться с правами root, название диска microSD (sdc) в вашей системе может быть другим.
Сначала установим модули ядра (необходимы права root) с помощью команды :

1
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/ext4 modules_install

Перед копированием только-что собранного образа ядра рекомендуется сохранить старый рабочий образ на тот случай, если новый образ окажется неработоспособным :

1
2
#KERNEL=kernel7
#cp /mnt/fat32/$KERNEL.img /mnt/fat32/$KERNEL-backup.img

Теперь копируем образ ядра и дерево устройств на карту памяти microSD :

1
2
3
4
#cp arch/arm/boot/zImage /mnt/fat32/$KERNEL.img
#cp arch/arm/boot/dts/*.dtb /mnt/fat32/
#cp arch/arm/boot/dts/overlays/*.dtb* /mnt/fat32/overlays/
#cp arch/arm/boot/dts/overlays/README /mnt/fat32/overlays/

Отмонтируем файловую систему карты памяти :

1
2
#umount /mnt/fat32
#umount /mnt/ext4

Наконец-то можно установить карту памяти в Raspberry Pi 3 и подать питание. Если операционная система Linux успешно загрузиться, то сборку ядра можно считать удавшейся. В противном случае придется восстанавливать рабочую копию старого образа ядра (kernel7-backup.img).

Leave a Reply

You must be logged in to post a comment.