Hellolinuxカーネル-helloモジュールをLinuxカーネルに追加する方法

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カーネル、さようなら。

おすすめ

転載: blog.csdn.net/qq_32783703/article/details/109348448