#はじめに
Raspberry Pi 4B+上で、64-Bitカーネルとドライバーの開発を勉強したかったのですが、ほどよいドキュメントがなかったので、参考例になればと思い、実際に私が行った作業を記録として残すことにしました。
気づいた点があればコメントをお願いします。
#環境
- Raspberry Pi 4B+
- SD Card 32GB
#1.環境の確認
まず、環境の確認方法は以下の方法で行いました。参考のために結果のスクリーンショットも載せておきます。
$ uname -a
$ gcc -v
#2.GITとコンパイルに必要なパッケージのインストール
以下のコマンドでGITとビルドに必要なパッケージをインストールします。
$ sudo apt install git bc bison flex libssl-dev make
#3.ソースコードのダウンロード
以下のGITコマンドでソースコードをCloneします。ビルドに不必要なもをダウンロードしないために"--depth=1"を付けます。このオプションがないとブランチのヒストリーを含むリポジトリ全体をダウンロードしてしまいます。
git clone --depth=1 https://github.com/raspberrypi/linux
#4.カーネルコンフィギュレーション
デフォルトのコンフィギュレーションを設定します。ここでは64-bit のカーネルなのでARCH=arm64を指定して、Raspberry Pi 4B+で使うためにbcm2711_defconfigを指定します。
cd linux
KERNEL=kernel8
make ARCH=arm64 bcm2711_defconfig
#5.カーネルビルド
Raspberry Piの公式ドキュメントではカーネルビルドの時には、"Image modules dtbs"の3つを指定します。Raspberry Pi 4B+にはCPUのコアが4つあるので、ビルド時間の短縮のために、-j4を指定して4つのコアを使ってビルドしました。
make -j4 ARCH=arm64 Image modules dtbs
#5.カーネルインストール
注:カーネルのインストールの前に、必要であれば必ずSDカードのバックアップを取っておくことをお勧めします。
以下のコマンドを実行して、それぞれ必要なファイルを必要な場所に配置し再起動をします。
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image /boot/$KERNEL.img
#6.再起動と確認
再起動した後に"uname -a"コマンドを実行すると、インストール前と後ではリリース、バージョンが変わっていることが確認できると思います。
#7.モジュールのビルド環境
カーネルのビルドとインストールが終わったら、次にモジュールビルドの環境と確認用のhello.cを作ってモジュールのロードとアンロードを実行して開発環境を確認します。
###フォルダーの作成
mkdir hello_driver
cd hello_driver
###Makefileを書く
vi Makefile
###Makefileの内容
obj-m := hello.o
###hello.cを書く
vi hello.c
###hello.cの内容
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Ken Shimizu");
static int hello_init(void)
{
printk(KERN_INFO "Hello World\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Sayonara!\n");
}
module_init(hello_init);
module_exit(hello_exit);
#8.コンパイル
Makefile、ソースコード(hello.c)の用意ができたら次はコンパイルをします。コマンドは以下のようになります。-Cオプションでカーネルのソースコードがあるフォルダーを指定して、Mオプションでモジュールのソースコードがあるフォルダーを指定します。
make -C ../linux/ M=`pwd` modules
#9.ロードモジュール
insmodで出来上がったモジュールをロードして、lsmodで確認をしてみたいと思います。lsmodの結果のスクリーンショットも参考のために載せておきます。
sudo insmod ./hello.ko
lsmod | grep hello
最後にロードしたモジュールをアンロードして、syslogを確認してみましょう。printkで出力した文言が確認できると思います。
sudo rmmod hello
less /var/log/syslog
#終わりに
これでRaspberry Pi 4B+と64-bit OS上で、最小限のドライバーを開発するための環境が整いました。
#参考URL
https://www.raspberrypi.org/documentation/linux/kernel/building.md
https://qengineering.eu/install-raspberry-64-os.html
https://medium.com/@knownsec404team/how-to-develop-linux-driver-from-scratch-cc143e0c08a1