Linux 供给了一种经过 bootloader 向其传输发动参数的功用,内核开发者能够经过这种方法来向内核传输数据,然后操控内核发动行为。
一般的运用方法是,界说一个剖析参数的函数,然后运用内核供给的宏 __setup把它注册到内核中,该宏界说在 linux/init.h 中,因而要运用它有必要包括该头文件:
__setup(“para_name=”, parse_func)
para_name 为参数名,parse_func 为剖析参数值的函数,它担任把该参数的值转换成相应的内核变量的值并设置那个内核变量。内核为整数参数值的剖析供给了函数 get_option 和 get_opTIons,前者用于剖析参数值为一个整数的状况,然后者用于剖析参数值为逗号切割的一系列整数的状况,关于参数值为字符串的状况,需求开发者自界说相应的剖析函数。在源代码包中的内核程序kern-boot-params.c 说明晰三种状况的运用。该程序列举了参数为一个整数、逗号切割的整数串以及字符串三种状况,读者要想测验该程序,需求把该程序拷贝到要运用的内核的源码目录树的一个目录下,为了避免与内核其他部分混杂,作者主张在内核源码树的根目录下创立一个新目录,如 examples,然后把该程序拷贝到 examples 目录下偏重新命名为 setup_example.c,并且为该目录创立一个 Makefile 文件:
obj-y = setup_example.o
Makefile 仅许这一行就足够了,然后需求修正源码树的根目录下的 Makefile文件的一行,把下面行
core-y := usr/
修正为
core-y := usr/ examples/
留意:假如读者创立的新目录和重新命名的文件名与上面不同,需求修正上面所说 Makefile 文件相应的方位。 做完以上作业就能够依照内核构建过程去构建新的内核,在构建好内核并设置好lilo或grub为该内核的发动条目后,就能够发动该内核,然后运用lilo或grub的修改功用为该内核的发动参数行添加如下参数串:
setup_example_int=1234 setup_example_int_array=100,200,300,400 setup_example_string=Thisisatest
当然,该参数串也能够直接写入到lilo或grub的配置文件中对应于该新内核的内核命令行参数串中。读者能够运用其它参数值来测验该功用。
下面是作者体系上运用上面参数行的输出:
setup_example_int=1234
setup_example_int_array=100,200,300,400
setup_example_int_array includes 4 intergers
setup_example_string=Thisisatest
读者能够运用$dmesg | grep setup 来检查该程序的输出。
//filename: kern-boot-params.c #define MAX_SIZE 5 static int __init parse_int(char * s) ret = get_option(&s, &setup_example_int); static int __init parse_int_string(char *s) ret_str = get_options(s, MAX_SIZE, setup_example_int_array); static int __init parse_string(char *s) /*宏__setup()将剖析参数的函数注册到内核中*/
#include
staTIc int setup_example_int;
staTIc int setup_example_int_array[MAX_SIZE];
staTIc char setup_example_string[16];
{
int ret;
if (ret == 1) {
printk(“setup_example_int=%d\n”, setup_example_int);
}
return 1;
}
{
char * ret_str;
int i;
if (*ret_str != '\0') {
printk(“incorrect setup_example_int_array paramters: %s\n”, ret_str);
}
else {
printk(“setup_example_int_array=”);
for (i=1; i
if (i < (MAX_SIZE -1)) {
printk(“,”);
}
}
printk(“\n”);
printk(“setup_example_int_array includes %d intergers\n”, setup_example_int_array[0]);
}
return 1;
}
{
if (strlen(s) > 15) {
printk(“Too long setup_example_string parameter, \n”);
printk(“maximum length is less than or equal to 15\n”);
}
else {
memcpy(setup_example_string, s, strlen(s) + 1);
printk(“setup_example_string=%s\n”, setup_example_string);
}
return 1;
}
__setup(“setup_example_int=”, parse_int);
__setup(“setup_example_int_array=”, parse_int_string);
__setup(“setup_example_string=”, parse_string);