最初のlinuxカーネルモジュール


一、linuxカーネルヘッダファイルのインストール
yum install kernel-devel.x86_64

インストールが完了すると、ヘッダファイルはディレクトリに配置されます(システムによって異なります):/usr/src/kernels/3.10.0-1062.4.3.el 7.x 86_64
二、モジュールコードの作成
任意のディレクトリの下でファイルhello_を新規作成module.c、内容は以下の通りである.
#include 
#include 

static int __init hello_init(void)
{
    printk("---------my %s---------
", __FUNCTION__); return 0; } static void __exit hello_exit(void) { printk("---------my %s---------
", __FUNCTION__); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL");

三、Makefileの作成
とhello_module.c兄弟ディレクトリの下にMakefileファイルを作成します.内容は以下の通りです.
KERNEL_DIR=/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64
CUR_DIR=$(shell pwd)
obj-m = hello_module.o

build:
        make -C $(KERNEL_DIR) M=$(CUR_DIR) modules

clean:
        make -C $(KERNEL_DIR) M=$(CUR_DIR) clean

load:
        insmod hello_module.ko

unload:
        rmmod hello_module.ko 

そのうちKERNEL_DIR変数はカーネルヘッダファイルディレクトリを指します.
四、コンパイル
makeコンパイルの実行:
[work@vm kernel]$ make
make -C /usr/src/kernels/3.10.0-1062.4.3.el7.x86_64 M=/home/work/test/kernel modules
make[1]:     “/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64”
  CC [M]  /home/work/test/kernel/hello_module.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/work/test/kernel/hello_module.mod.o
  LD [M]  /home/work/test/kernel/hello_module.ko
make[1]:     “/usr/src/kernels/3.10.0-1062.4.3.el7.x86_64”

コンパイル後の現在のディレクトリ内のファイルは次のとおりです.
[work@vm kernel]$ ll
    220
-rw-rw-r--. 1 work work    320 11  20 20:45 hello_module.c
-rw-rw-r--. 1 work work 102144 11  20 20:53 hello_module.ko
-rw-rw-r--. 1 work work    856 11  20 20:53 hello_module.mod.c
-rw-rw-r--. 1 work work  58768 11  20 20:53 hello_module.mod.o
-rw-rw-r--. 1 work work  44944 11  20 20:53 hello_module.o
-rw-rw-r--. 1 work work    275 11  20 20:43 Makefile
-rw-rw-r--. 1 work work     46 11  20 20:53 modules.order
-rw-rw-r--. 1 work work      0 11  20 20:53 Module.symvers

モジュール情報の表示:
[work@vm kernel]$ modinfo hello_module.ko
filename:       /home/work/test/kernel/hello_module.ko
license:        GPL
retpoline:      Y
rhelversion:    7.7
srcversion:     D105845B0514D2D8892F4A0
depends:
vermagic:       3.10.0-1062.4.3.el7.x86_64 SMP mod_unload modversions

五、ロードとアンインストール
sudo make loadロードの実行:
[work@vm kernel]$ sudo make load
insmod hello_module.ko

sudo make unloadアンインストールを実行するには、次の手順に従います.
[work@vm kernel]$ sudo make unload
rmmod hello_module.ko

システムログファイルの表示:/var/log/messages
[root@vm work]# tail -f /var/log/messages
Nov 20 20:55:31 vm kernel: ---------my hello_init---------
Nov 20 20:56:07 vm kernel: ---------my hello_exit---------