13

新しいコードで使用するカスタム パラメーターをブート時にカーネルに渡したいと考えています。このパラメーターは数値です。

カーネルコマンドラインを使用してカーネルモジュールに値を渡す方法を知っていますmodule_param(). ここで、u-boot から値を渡したいと思います。

起動中または起動後にこれを行う方法はありますか?

4

3 に答える 3

14

カーネルモジュールに値を渡す方法を知っていれば十分です:)

insmod my_module param=value

モジュールがカーネルに組み込まれている場合、パラメーターをカーネルパラメーターに追加できます

vmlinux ... my_module.param=value ...

ここでの参照: kernel-parameters.txt

于 2013-07-15T17:55:10.593 に答える
9

U-Boot のinclude/config/board_xxx.hにあるボード ファイルを変更し、この例で設定されている最後の変数と同じように$bootargsを変更します。

setenv bootargs display=\${display} console=\${consoledev},\${baudrate} root=/dev/mmcblk0p1 rw rootdelay=1 control.cmd1={cmd1}

controlは、Linux プロンプトで完全に起動するために必要なため、insmod できない組み込みドライバー モジュールの名前です。

cmd1は、使用したモジュールで定義したグローバル変数です。

module_param(cmd1, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);

したがって、$bootargs 変数に次のようなものを追加するだけです。

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>

于 2013-07-16T18:07:03.283 に答える
4

Linux ソース ドキュメント

私は時間の口からそれを好みますv4.12/Documentation/admin-guide/kernel-parameters.rst :

Module parameters can be specified in two ways: via the kernel command
line with a module name prefix, or via modprobe, e.g.:

    (kernel command line) usbcore.blinkenlights=1
    (modprobe command line) modprobe usbcore blinkenlights=1

Parameters for modules which are built into the kernel need to be
specified on the kernel command line.  modprobe looks through the
kernel command line (/proc/cmdline) and collects module parameters
when it loads a module, so the kernel command line can be used for
loadable modules too.

簡単に試す方法

CONFIG_DUMMY_IRQ=y

次にコマンドラインで:

dummy-irq.irq=12

カーネルが起動すると、次のように表示されます。

dummy-irq: registered for IRQ 12

initのから出力されdummy-irq.cます。

コード パス

まだ完全なコード パスをたどることはできませんでしたが、 https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13.でエンコードされていると思います。

#define MODULE_PARAM_PREFIX KBUILD_MODNAME "."

これはmodule_paramマクロ ウォーターフォールで展開されます。その 1 つのステップには、そのコードがどれほど明確であるかを示す Linus によるコメントが含まれています。

/* Lazy bastard, eh? */

watch最終的に設定するQEMU GDBバックトレースdummy-irq.c:irqは次のとおりです。

#0  kstrtouint (s=<optimized out>, base=<optimized out>, res=0xffffffff81a8d820 <irq>) at lib/kstrtox.c:225
#1  0xffffffff8106e124 in param_set_uint (val=<optimized out>, kp=<optimized out>) at kernel/params.c:295
#2  0xffffffff8106ed98 in parse_one (handle_unknown=<optimized out>, arg=<optimized out>, max_level=<optimized out>, min_level=<optimized out>, num_params=<optimized out>, params=<optimized out>, doing=<optimized out>, val=<optimized out>, param=<optimized out>) at kernel/params.c:148
#3  parse_args (doing=<optimized out>, args=0xffff880007fdb99f "", params=<optimized out>, num=<optimized out>, min_level=<optimized out>, max_level=<optimized out>, arg=0x0 <irq_stack_union>, unknown=0xffffffff81aeb8e5 <unknown_bootoption>) at kernel/params.c:243
#4  0xffffffff81aebc6d in start_kernel () at init/main.c:518
于 2017-07-11T21:32:22.240 に答える