2013-07-15 24 views
8

ブート時に私の新しいコードが使用する カーネルにカスタムパラメータを渡したいと思います。このパラメータは数値です。ブート時に組み込みLinuxカーネルモジュールに値を渡すには?

私はカーネルコマンドラインを使ってカーネルモジュールに値を渡す方法、つまりmodule_param()を知っています。今私はu-bootから価値を渡したいと思う。

ブート中またはブート後にこれを行う方法はありますか?あなたは、カーネルモジュールに値を渡す方法を知っていれば

+1

はSOへようこそ!潜在的なポスターがいくつかの文脈を得るように、少しのコードを残すことは、常に役立ちます。 – Enigmadan

答えて

5

は、あなたのBを変更しますでoardファイル存在$ bootargsこの例では設定されている最後の変数に似を変更し、U-ブートの/ configに/ board_xxx.hを含める:

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

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

CMD1私は私が使用したモジュール中で定義したグローバル変数です:

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

ので、ご$ bootargs varは単にのようなものを付加する必要があります

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>

7

、あなたは十分に知っている:)

あなたのモジュールが内蔵されている場合はカーネルにinsmod my_module param=value

は、あなたがカーネルにあなたのパラメータを追加することができますパラメータここ

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

参照:kernel-parameters.txt

+0

上記はx86アーキテクチャのソリューションです。 – vm18553

+0

上記はx86アーキテクチャーの解決策です。 私はARMアーキテクチャで作業しており、ブートローダーとしてU-bootを使用しています。私はどのようにubootから同じことをすることができます。 – vm18553

+0

これは他のアーキテクチャと他のブートローダとのソリューションです。 ubootでは、あなたはbootargs環境を持っています。 – Federico

0

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 

initdummy-irq.cから印刷されています。

コードパス

私はまだ完全なコードパスをたどることが出来なかったが、私は.https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13でエンコードされていると思う:module_paramマクロ滝で展開されます

#define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 

その1つのステップには、そのコードがどの程度明確であるかを示すLinusのコメントが含まれています。

/* Lazy bastard, eh? */ 

dummy-irq.c:irqのためにそれを設定終わるQEMU GDB watchバックトレースがある:

#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 
関連する問題