2013-07-15 9 views
8

Voglio passare un parametro personalizzato al kernel al momento dell'avvio, che verrà utilizzato dal mio nuovo codice. Questo parametro è un numero.Come passare un valore al modulo del kernel Linux incorporato al momento dell'avvio?

So come passare il valore al modulo del kernel utilizzando la riga di comando del kernel i. Ora voglio passare il valore da u-boot.

C'è un modo per farlo, durante o dopo l'avvio?

+1

Benvenuti a SO! È sempre utile lasciare un po 'di codice in modo che i potenziali poster ottengano un contesto. – Enigmadan

risposta

5

Modifica la b file di oard presente in include/config/board_xxx.h di U-Boot, modificare $ bootargs simili a l'ultima variabile che viene impostata in questo esempio:

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

controllo è il nome del modulo driver integrato che non riesco a insmod perché ne ho bisogno per l'avvio completo al prompt di Linux.

cmd1 è la variabile globale ho definito nel modulo in cui ho usato:

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

modo, i vostri $ bootargs var deve semplicemente essere aggiunto con qualcosa di simile:

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>

7

Se sai come passare un valore a un modulo del kernel, si sa abbastanza :)

insmod my_module param=value

Se il modulo è integrato nel kernel, è possibile aggiungere il parametro al kernel parametri

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

Qui un riferimento: kernel-parameters.txt

+0

Sopra è la soluzione per l'architettura x86. – vm18553

+0

Sopra è la soluzione per x86 architechture. Sto lavorando su architettura ARM e utilizzo U-boot come boot loader. Come posso fare lo stesso da uboot. – vm18553

+0

È la soluzione anche per qualsiasi altra architettura, con qualsiasi altro bootloader. In uboot, hai l'ambiente di bootarg. – Federico

0

documentazione source Linux

01.235.

io lo preferisco dalla bocca del hourse 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. 

Un modo semplice per provarlo

CONFIG_DUMMY_IRQ=y 

poi sulla riga di comando:

dummy-irq.irq=12 

e quando il stivali del kernel si vede:

dummy-irq: registered for IRQ 12 

che viene stampato dallo init di dummy-irq.c.

percorso di codice

Non sono riuscito a seguire il percorso di codice completo ancora, ma credo che il . è codificato in https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13:

#define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 

che viene ampliato in module_param macro cascata , uno step di cui contiene un commento di Linus che indica quanto è chiaro quel codice:

/* Lazy bastard, eh? */ 

Il QEMU GDB watch backtrace che finisce per l'impostazione per 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 
Problemi correlati