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 は起動時にモジュールがカーネルにロードされたことを確認できます。