【カーネルドライバ】カーネルモジュールコマンド

00. 目次

01. 概要

期待どおりに独自のカーネル モジュールをコンパイルしました。次は、このカーネル モジュールの使用方法を理解します。scp または NFS を介して test.ko を開発ボードにコピーします。これらのカーネル モジュール関連ツールを 1 つずつ説明しましょう。

ここに画像の説明を挿入します

02.インズモッド

BusyBox v1.27.2 (2023-08-17 12:27:26 CST) multi-call binary.

Usage: insmod FILE [SYMBOL=VALUE]...

Load kernel module

応用例:

[root@rk3399:/mnt/a72/code/1module]# insmod test.ko
[16933.818461] Hello  Module Init
[root@rk3399:/mnt/a72/code/1module]# 

Calculation.ko は、parametermodule.ko のパラメータと関数に依存しているため、最初に手動でparametermodule.koをロードし、次にcalculation.koをロードします。

Modprobe と insmod は同じ機能を持ち、モジュールをカーネルにロードすることもできます。また、modprobe はモジュール間の依存関係をチェックし、それらの依存関係を順番にロードすることもできます。これは、insmod を順番に複数回実行することと理解できます。

Calculation.ko とparametermodule.ko を順番にロードする必要があり、modprobe ツールを使用すると、parametermodule.ko を直接ロードできます。もちろん、modprobe の前に、depmod -a を使用してモジュール間の依存関係を確立する必要があります。(注:depmod -aコマンドを使用して依存関係を確立するには、calculation.ko とparametermodule.ko を/lib/modules/内核版本ディレクトリにコピーする必要があります。さらに、 を使用してmodprobeドライバーをロードする場合、ドライバー名は含まれません.ko。そうしないと、次のエラーが表示されますmodprobe: FATAL: Module calculation.ko not found in directory /lib/modules/4.19.35-imx6。ドライバーをアンインストールする場合も同様です)

03. lsmod

BusyBox v1.27.2 (2023-08-17 12:27:26 CST) multi-call binary.

Usage: lsmod 

List loaded kernel modules

lsmod は、現在のカーネル内のすべてのモジュールをリストし、フォーマットされた状態でターミナルに表示します。原則として、出力用に /proc/modules 内の情報のフォーマットを調整します。lsmod 出力リストには「使用者」という列があり、このモジュールが他のモジュールによって使用されていることを示し、モジュール間の依存関係を示します。

カーネルにモジュールをロードしたい場合は、insmod が最も簡単な方法です。insmod + モジュールのフル パスで目的を達成できます。前提として、モジュールは他のモジュールに依存しておらず、sudo 権限が必要です。他のモジュールのシンボルを使用するかどうかわからない場合は、後で詳しく使用する modprobe を試すこともできます。

insmod コマンドを使用して test.ko メモリ モジュールをロードします。メモリ モジュールをロードすると、メモリ モジュールは自動的に module_init() 関数を実行して初期化操作を実行します。この関数は「hello module init」を出力します。システムにロードされたカーネル モジュールを再度確認すると、リスト内に test.ko が見つかります。

応用例

[root@rk3399:/mnt/a72/code/1module]# lsmod 
Module                  Size  Used by    Tainted: G  
test                   16384  0 
[root@rk3399:/mnt/a72/code/1module]# 

04. デプモッド

Usage:
	depmod -[aA] [options] [forced_version]

If no arguments (except options) are given, "depmod -a" is assumed

depmod will output a dependency list suitable for the modprobe utility.

Options:
	-a, --all            Probe all modules
	-A, --quick          Only does the work if there's a new module
	-e, --errsyms        Report not supplied symbols
	-n, --show           Write the dependency file on stdout only
	-P, --symbol-prefix  Architecture symbol prefix
	-C, --config=PATH    Read configuration from PATH
	-v, --verbose        Enable verbose mode
	-w, --warn           Warn on duplicates
	-V, --version        show version
	-h, --help           show this help

The following options are useful for people managing distributions:
	-b, --basedir=DIR    Use an image of a module tree.
	-F, --filesyms=FILE  Use the file instead of the
	                     current kernel symbols.
	-E, --symvers=FILE   Use Module.symvers file to check
	                     symbol versions.
deng@local:~/a72/x3399/kernel/include/linux$ 

modprobe は、特定のモジュールが他のどのモジュールに依存しているかをどのようにして知るのでしょうか? このプロセスでは、depend が決定的な役割を果たします。modprobe が実行されると、モジュールのインストール ディレクトリで module.dep ファイルが検索されます。これは、depmod によって作成されたモジュールの依存関係ファイルです。

05.rmmod

Usage:
	rmmod [options] modulename ...
Options:
	-f, --force       forces a module unload and may crash your
	                  machine. This requires Forced Module Removal
	                  option in your kernel. DANGEROUS
	-s, --syslog      print to syslog, not stderr
	-v, --verbose     enables more messages
	-V, --version     show version
	-h, --help        show this help
deng@local:~/a72/x3399/kernel/include/linux$ 

rmmod ツールはカーネル内で実行されているモジュールのみを削除するため、パスを渡すだけで済みます。

rmmod コマンドがメモリ モジュールをアンインストールすると、メモリ モジュールは自動的に *_exit() 関数を実行してクリーニング操作を実行します。hellomodule の *_exit() 関数は内容を 1 行出力しますが、コンソールには表示されません。 dmesg を使用して表示できますが、表示されない理由は printk の印刷レベルに関連しています。printk 関数については前に詳しく説明しました。rmmod は、モジュールが依存するモジュールをアンインストールしません。順番にアンインストールする必要があります。もちろん、modprobe -r を使用すると、ワンクリックでモジュールをアンインストールできます。

応用例:

[root@rk3399:/mnt/a72/code/1module]# rmmod test
[17225.438774] Hello  Module Exit
[root@rk3399:/mnt/a72/code/1module]# 

06. 改造情報

Usage:
	modinfo [options] filename [args]
Options:
	-a, --author                Print only 'author'
	-d, --description           Print only 'description'
	-l, --license               Print only 'license'
	-p, --parameters            Print only 'parm'
	-n, --filename              Print only 'filename'
	-0, --null                  Use \0 instead of \n
	-F, --field=FIELD           Print only provided FIELD
	-k, --set-version=VERSION   Use VERSION instead of `uname -r`
	-b, --basedir=DIR           Use DIR as filesystem root for /lib/modules
	-V, --version               Show version
	-h, --help                  Show this help
deng@local:~/a72/x3399/kernel/include/linux$ 

modinfo は、カーネル モジュールで定義したいくつかのマクロを表示するために使用されます。modinfo を通じて確認することができ、出力された情報から、モジュールが GPL プロトコルに従っていることや、モジュールの作成者情報などがわかります。この情報は、関連するカーネル モジュール情報宣言関数によってモジュール コード内で宣言されます。

deng@local:~/code/test/1module$ modinfo test.ko
filename:       /home/deng/a72/code/1module/test.ko
alias:          test_module
description:    hello module
author:         uplooking
license:        GPL v2
depends:        
vermagic:       4.4.189 SMP mod_unload aarch64
deng@local:~/code/test/1module$ 

07. システムはモジュールを自動的にロードします

自分でモジュールを作成しました。あるいは、ボードの電源を入れたときにモジュールを自動的にロードするにはどうすればよいですか? ここでは、前述の depmod ツールと modprobe ツールを使用する必要があります。

まず、自動的にロードするモジュールを「/lib/modules/kernel version」ディレクトリに置く必要があります。「uname -r」を使用してカーネル バージョンを照会します。次に、depmod を使用してモジュール間の依存関係を確立します。コマンド ' depmod - a'; 現時点では、modules.dep でモジュールの依存関係を確認できます。これは、次のコマンドを使用して表示できます。

cat /lib/modules/内核版本/modules.dep | grep calculation

最後に、独自のモジュールを /etc/modules に追加します。設定ファイルでは、モジュールが .ko の形式で書かれていないことに注意してください。これは、モジュールがカーネルと密結合していることを意味します。一部のシステムは、カーネルと密結合する必要があります。 mm サブシステムなどのカーネル 一般的には .ko 形式で記述するのが良いです エラーが発生してもカーネル内ではパニックエラーにはなりません カーネルに組み込まれている場合はエラーが発生してもパニックが発生します。

deng@local:~/a72/x3399/kernel/include/linux$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.


次に、開発ボードを再起動すると、lsmod は起動時にモジュールがカーネルにロードされたことを確認できます。

08. 付録

おすすめ

転載: blog.csdn.net/dengjin20104042056/article/details/132878589