Как передать значение встроенному модулю ядра Linux во время загрузки?
Я хочу передать пользовательский параметр ядру во время загрузки, который будет использовать мой новый код. Этот параметр является числом.
Я знаю, как передать значение модулю ядра с помощью командной строки ядра, то есть module_param()
. Теперь я хочу передать значение из u-boot.
Есть ли способ сделать это во время или после загрузки?
Ответы
Ответ 1
Измените файл вашей платы, содержащийся в include/config/board_xxx.h U-Boot, измените $ bootargs, аналогичный последней переменной, установленной в этом примере:
setenv bootargs display=\${display} console=\${consoledev},\${baudrate} root=/dev/mmcblk0p1 rw rootdelay=1 control.cmd1={cmd1}
control - это имя встроенного модуля драйвера, который я не могу включить, потому что мне нужно его для полной загрузки в приглашении Linux.
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>
Ответ 2
Если вы знаете, как передать значение модулю ядра, вы знаете достаточно :)
insmod my_module param=value
Если ваш модуль встроен в ядро, вы можете добавить свой параметр к параметрам ядра
vmlinux... my_module.param=value...
Здесь ссылка: kernel-parameters.txt
Ответ 3
Документация по 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
, один шаг которого содержит комментарий Linus, который указывает, насколько ясен этот код:
/* Lazy bastard, eh? */
QDMU GDB watch
обратную трассировку, которая заканчивает установку его для 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