1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi 4Bの64-bit Kernelのローカルビルドとドライバーの開発環境をつくってみた。

Last updated at Posted at 2021-06-27

#はじめに
Raspberry Pi 4B+上で、64-Bitカーネルとドライバーの開発を勉強したかったのですが、ほどよいドキュメントがなかったので、参考例になればと思い、実際に私が行った作業を記録として残すことにしました。
気づいた点があればコメントをお願いします。

#環境

  • Raspberry Pi 4B+
  • SD Card 32GB

#1.環境の確認
まず、環境の確認方法は以下の方法で行いました。参考のために結果のスクリーンショットも載せておきます。

$ uname -a
$ gcc -v

raspberry-pi-2.jpg

#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"コマンドを実行すると、インストール前と後ではリリース、バージョンが変わっていることが確認できると思います。

###インストール前
Rasp64_check_varsion_before_install.jpg

###インストール後
Rasp64_check_varsion.jpg

#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

Rasp64_make_modules.jpg

#9.ロードモジュール
insmodで出来上がったモジュールをロードして、lsmodで確認をしてみたいと思います。lsmodの結果のスクリーンショットも参考のために載せておきます。

sudo insmod ./hello.ko
lsmod | grep hello

Rasp64_lsmod.jpg

最後にロードしたモジュールをアンロードして、syslogを確認してみましょう。printkで出力した文言が確認できると思います。

sudo rmmod hello
less /var/log/syslog

Rap64_less_syslog.jpg

#終わりに
これで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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?