リアルタイム性のあるOSを触ってみたくなった。Raspberry Pi 3にRTカーネルをインストールする。ビルドはクロス環境を使う。つまり、ホストとしてはWindows 10(Corei7)、ターゲットとしてRaspberry Pi 3。
環境構築方法は先輩諸氏の記事を参考にさせていただいた(末尾に挙げておいた)。
手順
ビルドするバージョンを決める(ホスト)
最新であればいいというわけではないらしい。今回は、比較的新しそうなリアルタイム・カーネルがあるので、それを使わせてもらう(手間が大幅に省ける)。
ビルドに必要なツールを揃える(ホスト)
rpi
という作業用ディレクトリを作成することにする(好み)。
sudo apt-get install git bc
mkdir rpi
cd rpi
git clone https://github.com/raspberrypi/tools
export PATH=$PATH:~/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
カーネルを作るのに必要なソースをダウンロードする(ホスト)
git clone --depth=1 --branch rpi-4.18.y-rt https://github.com/raspberrypi/linux
ビルドの環境を整える(ホスト)
export INSTALL_MOD_PATH=`pwd`/rtkernel
mkdir -p $INSTALL_MOD_PATH
ビルドする(ホスト)
pushd linux
KERNEL=kernel7
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtb
popd
ターゲットにコピーするファイルを集める(ホスト)
mkdir -p $INSTALL_MOD_PATH/boot
pushd linux
./scripts/mkknlimg ./arch/arm/boot/zImage $INSTALL_MOD_PATH/boot/$KERNEL.img
cp ./arch/arm/boot/dts/*.dtb $INSTALL_MOD_PATH/boot/
cp -r ./arch/arm/boot/dts/overlays $INSTALL_MOD_PATH/boot
popd
# Wifi用のFirmware
git clone --depth 1 https://github.com/RPi-Distro/firmware-nonfree
cp -r ./firmware-nonfree/brcm ./rtkernel/lib/firmware
# czf rpi-4.18.y-rt.tar.gzはターゲットにコピーするファイル
tar czf rpi-4.18.y-rt.tar.gz boot/ lib/
ターゲットにビルドしたカーネルを展開する(ターゲット)
作成したカーネル(rpi-4.18.y-rt.tar.gz
)は、ターゲットの$HOME/rtkernel
にコピーしたとする。
# ファイルのコピーは省略(手段は何でもいい)
cd rtkernel
tar xzfrpi-4.18.y-rt.tar.gz
カーネルを書き換える(ターゲット)
動作が確認されているバージョンはバックアップしておく。
/boot/cmdline.txt
にsdhci_bcm2708.enable_llm=0
という行を追加する。
sudo -s
cd boot
cp -rd * /boot/
cd ../lib
cp -rd * /lib/
reboot
テストしてみる(ターゲット)
uname -a
# Linux raspberrypi 4.14.74-rt44-v7+ #1 SMP PREEMPT RT Fri Nov 2 15:34:54 JST 2018 armv7l GNU/Linux
git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git
cd ~/rt-tests
make -j4
#
echo performance | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# シングルコア
cd ~/rt-tests && ./hackbench -l 1000000 & sleep 5 ; sudo ./cyclictest -p98 -m -l 50000; sleep 5 ; killall hackbench
# マルチコア
cd ~/rt-tests && ./hackbench -l 1000000 & sleep 5 ; sudo ./cyclictest --smp -p98 -m -l 50000; sleep 5 ; killall hackbench