2013-07-15 24 views
8

Tôi muốn chuyển thông số tùy chỉnh cho hạt nhân vào lúc khởi động, mã mới của tôi sẽ sử dụng. Tham số này là một số.Làm thế nào để chuyển một giá trị để xây dựng mô-đun hạt nhân Linux vào lúc khởi động?

Tôi biết cách chuyển giá trị cho mô-đun hạt nhân bằng cách sử dụng dòng lệnh hạt nhân tức là module_param(). Bây giờ tôi muốn chuyển giá trị từ u-boot.

Có cách nào để thực hiện việc này, trong hoặc sau khi khởi động không?

+1

Chào mừng bạn đến SO! Luôn luôn hữu ích khi để lại một chút mã để các áp phích tiềm năng có được một số ngữ cảnh. – Enigmadan

Trả lời

5

Modify b của bạn tập tin oard hiện diện trong bao gồm/config/board_xxx.h của U-Boot, sửa đổi $ bootargs tương tự như biến cuối cùng được thiết lập trong ví dụ này:

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

kiểm soát là tên của được xây dựng trong mô-đun trình điều khiển mà tôi không thể insmod bởi vì tôi cần nó để khởi động đầy đủ để các dấu nhắc Linux.

cmd1 là biến toàn cục tôi đã xác định trong mô-đun trong đó tôi đã sử dụng:

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

như vậy, bạn $ bootargs var chỉ đơn giản là cần phải được nối với một cái gì đó như:

<your_mod_name>.<your_mod_parameter_var_name>=<an_appropriate_value>

7

Nếu bạn biết làm thế nào để vượt qua một giá trị cho một mô-đun hạt nhân, bạn biết đủ :)

insmod my_module param=value

Nếu mô-đun của bạn được tích hợp sẵn trong kernel, bạn có thể thêm tham số của mình vào hạt nhân thông số

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

Dưới đây là một tài liệu tham khảo: kernel-parameters.txt

+0

Trên đây là giải pháp cho kiến ​​trúc x86. – vm18553

+0

Trên đây là giải pháp cho kiến ​​trúc x86. Tôi đang làm việc trên kiến ​​trúc ARM và sử dụng U-boot làm bộ nạp khởi động. Làm thế nào tôi có thể làm tương tự từ uboot. – vm18553

+0

Đây cũng là giải pháp cho bất kỳ kiến ​​trúc nào khác, với bất kỳ bộ nạp khởi động nào khác. Trong uboot, bạn có môi trường bootargs. – Federico

0

Linux tài liệu nguồn

01.235.

tôi thích nó từ miệng của 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. 

Cách dễ dàng để thử nó ra

CONFIG_DUMMY_IRQ=y 

sau đó trên dòng lệnh:

dummy-irq.irq=12 

và khi khởi động hạt nhân bạn thấy:

dummy-irq: registered for IRQ 12 

được in từ init của dummy-irq.c.

đường Mã

tôi không quản lý để đi theo con đường mã đầy đủ chưa, nhưng tôi nghĩ rằng . được mã hoá tại https://github.com/torvalds/linux/blob/v4.12/include/linux/moduleparam.h#L13:

#define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 

mà được mở rộng trong các thác nước vĩ mô module_param , một bước trong đó có một nhận xét của Linus cho biết mã rõ ràng như thế nào:

/* Lazy bastard, eh? */ 

Các QEMU GDB watch backtrace rằng kết thúc cài đặt nó cho dummy-irq.c:irq là:

#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 
Các vấn đề liên quan