четверг, 12 сентября 2013 г.

BeagleBone Black - Install Gentoo part 2: configure, make & install Linux Kernel

Эта третья статья из цикла Gentoo Linux на BeagleBone Black. В этой части мы будем собирать ядро (Kernel) Linux. Также будет рассмотрена установка ядра на ту систему, которую мы подготовили в предыдущей части. Отдельным этапом станет разговор про настройку ядра.


Предисловие
Надеюсь, мне не нужно объяснять, для чего нужно ядро ОС, т.к. данный курс предполагает наличие базовых знаний у читателя относительно устройства программной части системы.
Как было показано в предыдущей части, основной загрузчик U-Boot после своего запуска помимо файла настроек ожидает ещё в соседнем разделе (втором), наличия загружаемого образа ядра c полным именем /boot/uImage. Можно конечно взять готовый образ, однако мы займёмся его сборкой самостоятельно.
Также добавлю ещё несколько уточнений. На тот момент, когда писалась эта статья последней актуальной для патчей веткой была 3.8, а последняя версия соответственно 3.8.13. Если вы читаете статью, когда доступа к этой версии уже нет, можете уточнить у автора где взять необходимые исходные коды. Также замечу, что в Gentoo Linux это ядро под запретом т.к. оно не соответствует политике безопасности (из-за ошибок на х86_64 архитектуре в модуле iptables).

Получение исходного кода
Перейдя в нашу рабочую директорию (для меня это /root/BBB/) установим заготовку для сборки ядра:

# git clone https://github.com/beagleboard/kernel.git

Это набор базовых скриптов и патчей для 3.8 ветки. Необходимость этих патчей обоснована тем что не все изменения включаются в основное (ванильное) ядро Linux. И перейдём в этот каталог:

# cd kernel

Переключим git на ветку 3.8:

# git checkout origin/3.8 -b 3.8

Если у вас не настроен git для вашего пользователя (root), то самое время это сделать:

# git config --global user.email none@none.no

Затем запустим скрипт получения исходного кода ядра и применения исправлений для него:

# ./patch.sh

Теперь у нас  есть все исходные коды ядра, которые доработаны под нашу плату и можно перейти в каталог ядра для дальнейших операций с ним:

# cd kernel

Получение дополнительного встраиваемого ПО
Т.к. МП Sitara AM3359 состоит из нескольких процессорных ядер, то для каждого их них нужно своё ПО. В нашем случае, дополнительная прошивка (firmware), нужна для контроллера питания, который в нашем МП представлен ядром ARM Cortex-M3, в отличие от основного процессора ARM Cortex-A8, это ядро имеет другую (ограниченную) систему команд, и не может исполнять ядро Linux для управления, поэтому мы установим для него уже собранную прошивку:

# wget "http://arago-project.org/git/projects/?p=am33x-cm3.git;a=blob_plain;f=bin/am335x-pm-firmware.bin;hb=HEAD" -O firmware/am335x-pm-firmware.bin

Настройка
Если у вас много свободного времени и знаний, то можете настроить всё вручную, документации по МП и плате должно хватить вам с лихвой. Однако я настоятельно рекомендую не тратить своё время и воспользоватся готовым конфигурационным файлом:

# cp ../configs/beaglebone .config

Сборка
Тут всё очень просто:

# make -j9 ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linux-gnueabi- uImage dtbs

Число после j вы можете менять по своему усмотрению, если же вы планируете чем либо заниматься при сборке ядра (а это процесс не быстрый), то рекомендую выставить значение либо равное количеству процессорных ядер на вашем ПК, либо +1 к их количеству. Если ядро перед сборкой не выдало никаких ошибок, то оно должно собраться. Иначе, смотрите за предупреждения  и ошибки ядра. По ним, как правило ясно, что именно происходит не так и чего не хватает.

Установка
Начнём установку с монтирования носителя, т.к. Linux Kernel, это часть Gentoo Linux, то это второй раздел:

# mount /dev/sdb2 p2

Далее нам необходимо создать каталог загрузки (/boot):

# mkdir p2/boot

После можно копировать образ ядра, и скомпиленный файл Device Tree, и отмонтируем раздел:

# cp kernel/kernel/arch/arm/boot/{uImage,/dts/am335x-boneblack.dtb} p2/boot/
# umount p2

Теперь у нас есть запускаемый образ ядра, и его можно пробовать

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

U-Boot SPL 2013.04 (Sep 02 2013 - 19:46:37)
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0 
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Peripheral mode controller at 47401000 using PIO, IRQ 0
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0 
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Host mode controller at 47401800 using PIO, IRQ 0
OMAP SD/MMC: 0
reading u-boot.img
reading u-boot.img

U-Boot 2013.04 (Sep 02 2013 - 19:46:37)
I2C:   ready
DRAM:  512 MiB
WARNING: Caches not enabled
NAND:  No NAND device found!!!
0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Warning - readenv() failed, using default environment
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0 
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Peripheral mode controller at 47401000 using PIO, IRQ 0
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0 
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Host mode controller at 47401800 using PIO, IRQ 0
Net:   <ethaddr> not set. Validating first E-fuse MAC
cpsw, usb_ether
Hit any key to stop autoboot:  1 0 
gpio: pin 53 (gpio 53) value is 1
mmc0 is current device
micro SD card found
mmc0 is current device
gpio: pin 54 (gpio 54) value is 1
SD/MMC found on device 0
reading uEnv.txt
** Unable to read file uEnv.txt **
gpio: pin 55 (gpio 55) value is 1
4309520 bytes read in 515 ms (8 MiB/s)
gpio: pin 56 (gpio 56) value is 1
24868 bytes read in 22 ms (1.1 MiB/s)
Booting from mmc ...
## Booting kernel from Legacy Image at 80007fc0 ...
   Image Name:   Linux-3.8.13-00715-g836d639
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4309456 Bytes = 4.1 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 80f80000
   Booting using the fdt blob at 0x80f80000
   XIP Kernel Image ... OK
OK
   Using Device Tree in place at 80f80000, end 80f89123

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.8.13-00715-g836d639 (root@jane) (gcc version 4.6.3 (Gentoo 4.6.3 p1.13, pie-0.5.2) ) #8 SMP Mon Sep 2 01:11:25 OMST 2013
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=50c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: Generic AM33XX (Flattened Device Tree), model: TI AM335x BeagleBone
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] AM335X ES1.0 (neon )
[    0.000000] PERCPU: Embedded 8 pages/cpu @c0b18000 s9408 r8192 d15168 u32768
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 129792
[    0.000000] Kernel command line: console=ttyO0,115200n8 root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] __ex_table already sorted, skipping sort
[    0.000000] allocated 1048576 bytes of page_cgroup
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Memory: 511MB = 511MB total
[    0.000000] Memory: 510408k/510408k available, 13880k reserved, 0K highmem
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     vmalloc : 0xe0800000 - 0xff000000   ( 488 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xe0000000   ( 512 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf800000 - 0xbfe00000   (   6 MB)
[    0.000000]       .text : 0xc0008000 - 0xc0603bac   (6127 kB)
[    0.000000]       .init : 0xc0604000 - 0xc063a4c0   ( 218 kB)
[    0.000000]       .data : 0xc063c000 - 0xc06ae360   ( 457 kB)
[    0.000000]        .bss : 0xc06ae360 - 0xc0707e7c   ( 359 kB)
[    0.000000] Hierarchical RCU implementation.
[    0.000000] RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=1.
[    0.000000] NR_IRQS:16 nr_irqs:16 16
[    0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[    0.000000] Total of 128 interrupts on 1 active controller
....
[    2.331086] EXT4-fs (mmcblk0p2): mounted filesystem without journal. Opts: (null)
[    2.338989] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
[    2.359098] devtmpfs: error mounting -2
[    2.363450] Freeing init memory: 216K
[    2.367388] Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[    2.380395] [<c0010563>] (unwind_backtrace+0x1/0x8a) from [<c0389125>] (panic+0x51/0x148)
[    2.388937] [<c0389125>] (panic+0x51/0x148) from [<c0385927>] (kernel_init+0x67/0x90)
[    2.397107] [<c0385927>] (kernel_init+0x67/0x90) from [<c000c67d>] (ret_from_fork+0x11/0x34)
[    2.405896] drm_kms_helper: panic occurred, switching back to text console

Паника в конце, т.к у нас нету ещё Init программы, о чём нам и жалуется.

Послесловие
Ну и напоследок, традиционное видео:

Теперь к нашей конфигурации, мы получили ещё и ядро. Теперь нам осталось установить базовую систему и собрать её.

Комментариев нет:

Отправить комментарий