Linuxカーネルに最初のhellowordモジュールを追加する方法
興奮と眠れない夜で、私は最初のhello_kernelモジュールをLinuxカーネルに追加しました。これはLinuxカーネルであるhelloカーネルへの私の最初の挨拶です。
Linuxカーネルドライバーの場合と同様に、最初の章にはカーネルをロードする方法の詳細な説明がありません。こちらのWebサイトから学習してください。
https://blog.csdn.net/wait_for_taht_day5/article/details/50404572
Linuxカーネルの公式ダウンロードアドレス
https://www.kernel.org
これはLinuxカーネルの公式ウェブサイトです
私のテスト環境はubuntu仮想マシンです。Linuxカーネルを再コンパイルする場合は注意が必要です。カーネルは約20Gでコンパイルされます。2時間後、幸いなことにubuntuにカーネルコードツリーがあります。必要はありません。カーネルツリーがコンピューター上にあることがわかったので、このプロセスをコンパイルします
まず第一に
ls /lib/modules
コンピューターにはLinuxカーネルのリリースバージョンがたくさんあるのを見ました
zhanglei@zhanglei-virtual-machine:~$ ls /lib/modules/5.4.0-
5.4.0-26-generic/ 5.4.0-37-generic/ 5.4.0-40-generic/ 5.4.0-45-generic/
5.4.0-33-generic/ 5.4.0-39-generic/ 5.4.0-42-generic/ 5.4.0-47-generic/
ここで疑問があります。どのディレクトリを選択すればよいですか?
uname -r
あなたに答えを与えた
カーネルツリーは/lib/modules/5.4.0-47-generic/buildの下にあります
さて、コードを書き始めます。モジュールをLinuxカーネルにマウントする必要があります。hello_kernel.cを書くだけです。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static __init int hello_init(void)
{
printk(KERN_ALERT "HELLO,KERNEL\n");
return 0;
}
static __exit void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Kernel!\n");
}
module_init(hello_init);
module_exit(hello_exit);
コアマウント機能は2つだけです
module_init(hello_init);
module_exit(hello_exit);
ここで、printkがカーネルで定義されていることを説明する必要があります。関数はprintfに似ていますが、実行時にカーネルが外部Cライブラリに依存しないため、浮動小数点をフォーマットできないようには見えません。モジュールinsmod関数がロードされた後、モジュールはカーネルに接続されているため、printkを呼び出すことができます。もちろん、この関数を呼び出すこともできます(Linuxデバイスドライバーの概要)。
メイクファイルを書く必要があります
obj-m:=hello_kernel.o
KERNELBUILD := /lib/modules/$(shell uname -r)/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko
obj-mは、ファイルtest.oを「モジュール」としてコンパイルすることを意味します。カーネルにはコンパイルされませんが、別の「test.ko」ファイルが生成されます。
カーネルモジュールhello_kernel.koを見ることができます
最後に、モジュールをロードして、カーネルに挨拶します。!
zhanglei@zhanglei-virtual-machine:~$ sudo insmod hello_kernel.ko && tail -f /var/log/kern.log
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644488] hello_kernel: module license 'unspecified' taints kernel.
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644489] Disabling lock debugging due to kernel taint
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644602] hello_kernel: module verification failed: signature and/or required key missing - tainting kernel
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.646193] HELLO, lingyun IoT Studio!
Oct 28 23:44:54 zhanglei-virtual-machine kernel: [ 2401.079667] Goodbye, I have found a good job!
Oct 28 23:45:22 zhanglei-virtual-machine kernel: [ 2428.281660] HELLO, lingyun IoT Studio!
Oct 28 23:45:34 zhanglei-virtual-machine kernel: [ 2440.247857] Goodbye, I have found a good job!
Oct 28 23:45:46 zhanglei-virtual-machine kernel: [ 2453.022348] HELLO, lingyun IoT Studio!
Oct 28 23:45:56 zhanglei-virtual-machine kernel: [ 2462.435602] Goodbye, I have found a good job!
Oct 28 23:56:02 zhanglei-virtual-machine kernel: [ 3068.900484] HELLO,KERNEL
さて、カーネルに挨拶したことがわかりました
もう一度カーネルに別れを告げましょう
zhanglei@zhanglei-virtual-machine:~$ sudo rmmod hello_kernel.ko && tail -f /var/log/kern.log
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644489] Disabling lock debugging due to kernel taint
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.644602] hello_kernel: module verification failed: signature and/or required key missing - tainting kernel
Oct 28 23:42:51 zhanglei-virtual-machine kernel: [ 2277.646193] HELLO, lingyun IoT Studio!
Oct 28 23:44:54 zhanglei-virtual-machine kernel: [ 2401.079667] Goodbye, I have found a good job!
Oct 28 23:45:22 zhanglei-virtual-machine kernel: [ 2428.281660] HELLO, lingyun IoT Studio!
Oct 28 23:45:34 zhanglei-virtual-machine kernel: [ 2440.247857] Goodbye, I have found a good job!
Oct 28 23:45:46 zhanglei-virtual-machine kernel: [ 2453.022348] HELLO, lingyun IoT Studio!
Oct 28 23:45:56 zhanglei-virtual-machine kernel: [ 2462.435602] Goodbye, I have found a good job!
Oct 28 23:56:02 zhanglei-virtual-machine kernel: [ 3068.900484] HELLO,KERNEL
Oct 28 23:56:47 zhanglei-virtual-machine kernel: [ 3113.694009] Goodbye, Kernel!
^C
zhanglei@zhanglei-virtual-machine:~$
それ以来、カーネルとの最初のミーティングを完了しました。こんにちは、Linuxカーネル、さようなら。