这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » inux2.6.17对内核参数的解析的研究

共1条 1/1 1 跳转至

inux2.6.17对内核参数的解析的研究

菜鸟
2007-03-29 17:36:56     打赏

linux的配置菜单中有这样的内核参数设置,那么参数是怎么传进去的?内核是怎么解析他们的呢?

Boot options --->(console=ttyS0 root=/dev/ram0 initrd=0xF00000,234475) Default kernel command str)

当我们填写了上面的参数行的时候那么实际上我们是执行了这样的代码:

#define CONFIG_CMDLINE "console=ttyS0 root=/dev/ram0 initrd=0xF00000,234475"

在setup.c里面我们看到有这样的code:

static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;

所以default_command_line就被附值为"console=ttyS0 root=/dev/ram0 initrd=0xF00000,234475"字符串的首地址了

在setup_arch里面有这么几句代码:

char *from = default_command_line;

if (mdesc->fixup)//这一段code我们板子没有用,函数为空,未执行,正是因为有了这句所以才引入了新的变量saved_command_line

//而没有用原来的default_command_line。
mdesc->fixup(mdesc, tags, &from, &meminfo);

memcpy(saved_command_line, from, COMMAND_LINE_SIZE);//上面的分析显而易见了
saved_command_line[COMMAND_LINE_SIZE-1] = '\0';//最后结束标志
parse_cmdline(cmdline_p, from);

下面主要分析蓝色部分代码:

/*
* Initial parsing of the command line.
*/
static void __init parse_cmdline(char **cmdline_p, char *from)
{
char c = ' ', *to = command_line;
int len = 0;

for (;;) {
if (c == ' ') {
extern struct early_params __early_begin, __early_end;

/******************************************************/

//这一句指引我们到vmlinux.lds.S里面的这段code,

__early_begin = .;
*(.early_param.init)
__early_end = .;

这段code在指引我们到.early_param.init

#define __early_param(name,fn) \
static struct early_params __early_##fn __attribute_used__ \
__attribute__((__section__(".early_param.init"))) = { name, fn }

从这句我们可以看出.early_param.init是指向__early_param(name,fn) 函数的指针

当执行 __early_begin = .; 和__early_end = .;之间的代码是其实就是执行了某个解析函数。

setup.c里面有这样的定义:

__early_param("initrd=", early_initrd);

__early_param("mem=", early_mem);

从而一步一步的调用直到进入相应的参数解析函数里面去

/**************************************************/


struct early_params *p;

for (p = &__early_begin; p < &__early_end; p++) {
int len = strlen(p->arg);

if (memcmp(from, p->arg, len) == 0) {
if (to != command_line)
to -= 1;
from += len;
p->fn(&from);=================================================执行相应的解析函数

while (*from != ' ' && *from != '\0')
from++;
break;
}
}
}
c = *from++;
if (!c)
break;
if (COMMAND_LINE_SIZE <= ++len)
break;
*to++ = c;
}
*to = '\0';
*cmdline_p = command_line;
}

我的疑问是console=ttyS0 root=/dev/ram0 什么的参数怎么解析的呢?内核都是怎么运用他们的呢?大家讨论一下吧!




关键词: inux2.6.17     内核     参数     解析     研究     co    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]