2013-07-15 9 views
8

Chcę przekazać niestandardowy parametr do jądra podczas uruchamiania, , którego użyje mój nowy kod. Ten parametr jest liczbą.Jak przekazać wartość do wbudowanego modułu jądra Linux podczas startu systemu?

Wiem, jak przekazać wartość do modułu jądra za pomocą wiersza poleceń jądra, tj. module_param(). Teraz chcę przekazać wartość z u-boot.

Czy istnieje sposób, aby to zrobić, podczas lub po rozruchu?

+1

Witamy w SO! Zawsze pomaga zostawić trochę kodu, aby potencjalne plakaty miały jakiś kontekst. – Enigmadan

Odpowiedz

5

Modyfikowanie b Plik oard obecny w include/config/board_xxx.h U-Boot, modyfikować $ bootargs podobnych do ostatniej zmiennej, która jest ustawiona w tym przykładzie:

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

kontroli to nazwa z wbudowany moduł sterownika, którego nie mogę insmodować, ponieważ potrzebuję go do pełnego uruchomienia systemu Linux.

cmd1 jest zmienna globalna Mam zdefiniowane w module, w którym użyłem:

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

tak, twoje $ bootargs var po prostu musi być dołączony z czymś takim:

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>

7

Jeśli wiesz jak przekazać wartość do modułu jądra, wiesz tyle :)

insmod my_module param=value

Jeśli moduł jest wbudowany w jądro, można dodać parametr do jądra Parametry

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

Tutaj odniesienie: kernel-parameters.txt

+0

Powyżej to rozwiązanie dla architektury x86. – vm18553

+0

Powyżej jest rozwiązaniem dla architektury x86. Pracuję nad architekturą ARM i korzystam z U-boota jako programu startowego. Jak mogę zrobić to samo z Uboot. – vm18553

+0

Jest to rozwiązanie również dla każdej innej architektury, z każdym innym programem ładującym. W systemie uboot masz środowisko bootargs. – Federico

0

dokumentacja źródło Linux

Wolę go od Hourse ustach 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. 

łatwy sposób, aby go wypróbować

CONFIG_DUMMY_IRQ=y 

następnie w wierszu poleceń:

dummy-irq.irq=12 

i kiedy buty jądra, które widzisz:

dummy-irq: registered for IRQ 12 

wydrukowana z init z dummy-irq.c.

ścieżka Kod

nie udało mi się jeszcze śledzić pełną ścieżkę kodu, ale myślę, że . jest kodowany w https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13:

#define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 

który zostanie rozszerzony w module_param makro wodospadu , z których jeden krok zawiera komentarz Linusa, który wskazuje, jak czysty jest ten kod:

/* Lazy bastard, eh? */ 

QEMU GDB watch backtrace że kończy się ustawienie go na dummy-irq.c:irq jest:

#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 
Powiązane problemy