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
#include
#include
#include
#define max_size 5
static int setup_example_int;
static int setup_example_int_array[max_size];
static char setup_example_string[16];
static int __init parse_int(char * s)
{
int ret;
ret = get_option(&s, &setup_example_int);
if (ret == 1) {
printk(setup_example_int=%d\n, setup_example_int);
}
return 1;
}
static int __init parse_int_string(char *s)
{
char * ret_str;
int i;
ret_str = get_options(s, max_size, setup_example_int_array);
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
printk(%d, setup_example_int_array[i]);
if (i 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(setup_example_int=, parse_int);
__setup(setup_example_int_array=, parse_int_string);
__setup(setup_example_string=, parse_string);
华为MATE60是5G网络吗 华为MATE60是麒麟芯片吗
人脸识别一体机在景区管理中的应用
新岸线第三代移动芯片问世
新基建为数字化转型提供基础技术支撑,是最重要且必要的驱动力
Spring赌上未来的一击,响应式的WebFlux框架更优雅
用户与内核空间数据交换的方式之一:内核启动参数
手机通讯录丢了怎么恢复?教你如何快速找回苹果手机联系人
MPEG-2编码复用器中的FPGA逻辑设计
昕诺飞协助巴西一城市成功升级安装超过18.2万套全新LED路灯 用电成本将节省50%
LED数码管显示器的连接方式有哪些
我国电缆行业驶入发展快车道
基于FPGA技术实现编码器脉冲的M法测速逻辑电路
NAND Flash缺货达巅峰 明年Q1 SSD价格涨幅将超10%
MAX5978 集成10位I²C系统监测器的热插拔
介绍下如何新建一个STM32寄存器版的工程
坐公交车没带零钱?带着手机就行了
中国电子:人工智能芯片和存储器技术是未来人工智能竞赛的关键
小米之家新店预热:神机K30S至尊版线下现货供应!
中国的工业机器人国产化比例由目前的27%提高到50%
自制Vape笔DIY图解