ラズパイ カーネルのビルド


Ubuntu環境で、ラズパイのカーネルをビルドする。

ツール
インストール

$ mkdir raspi
$ cd raspi
$ git clone https://github.com/raspberrypi/tools

PATHの設定

$ export PATH="$HOME/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian:$HOME/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH"

ソースコード

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

defconfig の作成 (Raspberry Pi 2)

$ cd linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

カーネルのコンパイル
1時間くらいかかります

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

SDカードへの書込み
SDカードのデバイス名を調べる

$ ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda5
/dev/sdb  /dev/sdb1  /dev/sdb2

SDカードのマウント

$ mkdir mnt
$ mkdir mnt/fat32
$ mkdir mnt/ext4
$ sudo mount /dev/sdb1 mnt/fat32
$ sudo mount /dev/sdb2 mnt/ext4

SDカードへの書込み

(ext4)
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
(カーネルのバックアップ)
$ sudo cp -p mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
(fat32)
$ sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img
$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

SDカードのアンマウント

$ sudo umount mnt/fat32
$ sudo umount mnt/ext4

ラズパイでの確認
ラズパイにSDカードを挿して、電源を入れる。
無事にブートするかを確認する。
カーネル・バージョンを確認する。

$ uname -a
Linux raspberrypi 4.4.8-v7+ #1 SMP Tue Apr 26 01:16:11 JST 2016 armv7l GNU/Linux

2016-03-18-raspbian-jessie.img のカーネル・バージョン

Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux

参考
Raspberry Pi – KERNEL BUILDING
Raspberry Pi 2のカーネルをビルドしてみた


MAC で hello.c をARMバイナリにクロスコンパイルする


(1) Ubuntuの環境をつくる
MAC で Ubuntu を動かす (VirtualBox)

以降、Ubuntu環境です
(2) ARMの開発環境をインストールする

$ sudo apt-get install g++-arm-linux-gnueabihf

(3) hello.c をクロスコンパイルする
hello.c

#include <stdio.h>
int main(int argc, char *args[])
{
    printf("Hello, world!\n");
}

クロスコンパイルする

$ arm-linux-gnueabihf-gcc hello.c -o hello

実行すると、実行できないよというメッセージが出る

$ ./hello
bash: ./hello: cannot excute binary file:

(4) ARMの実行環境をインストールする

$ sudo apt-get install qemu-user qemu-user-static

環境設定する

$ update-binfmts --display qemu-arm
$ cd /lib/
$ sudo ln -s /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3 .
$ sudo ln -s /usr/arm-linux-gnueabihf/lib arm-linux-gnueabihf

実行すると、今度はOK

$ ./hello
Hello, world

(5) ラズパイで実行する
ラズパイに転送して、実行します。OKでした。

参考
Ubuntu 12.04 で hello.c をARMバイナリとしてコンパイルして実行してみる

debian – binfmt-support
binfmt_misc というカーネルモジュールは、システム管理者がファイル拡張子をベースにして各種バイナリ 形式をインタプリタに登録し、該当するファイルが実行された時には適切な インタプリタが呼び出されるようにできます。