Chapter 06

プログラムの起動と終了

みつきん
みつきん
2020.12.16に更新

hello.cを改造

先ほど作成した初めてのプログラムを少し改造します。

// 1. include header files.
#include <linux/module.h>

// 2. the module initialize function.
int init_module(void)
{
	printk("hello: init_module is called\n");
	return 0;
}

// 3. the modules cleanup(uninitialize) function.
void cleanup_module(void)
{
	printk("hello: cleanup_module is called\n");
}

// 4. the license information.
MODULE_LICENSE("GPL");

コメントを少しだけ詳しく書きました。3章では全部おまじないとしましたがC言語の知識があることを前提に変更点を説明すると、init_module関数のprintkの内容と、cleanup_module関数へのprintkの追加になります。

コメントの内容は(たぶん)後で詳しく解説しますので、ここでも「おまじない」だと思ってスルーしてください。

まず、書き換えたソースコードをビルドし直してラズパイへ転送します。ラズパイの電源は入っていますか?LANケーブルは接続されていますか?

それでは下記のコマンドを順番に実行して新しいプログラムをラズパイへ転送しましょう。

$ source /opt/poky/3.2+snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi
$ export KERNEL_SRC=${OECORE_TARGET_SYSROOT}/usr/src/kernel
$ make
$ scp ~/hello/hello.ko root@raspberrypi4.local:/home/root

プログラムの起動

PCからラズパイを操作するために次のコマンドを実行して、ラズパイと接続します。

$ ssh root@raspberrypi4.local

そして次のコマンドでプログラムを起動します。

root@raspberrypi4:~# insmod hello.ko

先ほどと同じようにinsmodで実行されたプログラムの出力結果を確認します。

root@raspberrypi4:~# dmesg | tail
...(snip)...
[  100.599084] hello: loading out-of-tree module taints kernel.
[  100.606518] hello: init_module is called

「hello: init_module is called」は表示されています。

つまりinit_module関数は実行されているということです。

「hello: cleanup_module is called」を表示するはずのcleanup_moduleは呼び出されないのでしょうか。

プログラムの終了

ところで、たった今起動したプログラムは実はまだ終了していません。

Linuxで動作中のプログラムを確認するためにはlsmodというコマンドを実行します。

root@raspberrypi4:~# lsmod
Module                  Size  Used by
hello                  16384  0
...(snip)...

プログラムを終了するためにrmmodというコマンドを実行します。

root@raspberrypi4:~# rmmod hello

Linuxではinsmodで起動されたプログラムはrmmodコマンドで終了する必要があります。

本当に終了できたかlsmodで確認します。

root@raspberrypi4:~# lsmod | grep hello
root@raspberrypi4:~#

helloがなくなっていれば、無事終了されています。次にプログラムの出力を確認します。

root@raspberrypi4:~# dmesg | tail
[  152.210308] hello: cleanup_module is called

「hello: cleanup_module is called」と表示されています。つまりcleanup_moduleが実行されたということになります。

ここまでのまとめ

この章では下記のことがわかりました。

  • プログラムの開始にはinsmod
  • プログラムの終了にはrmmod
  • 実行中のプログラムの確認にはlsmod
  • プログラムを起動するとinit_module関数が実行される
  • プログラムを終了するとcleanup_module関数が実行される