linux系统系动参数

uboot那边可以设置bootargs
linux kernel那边有Default command string,对应CONFIG_CMDLINE,这个选项有时候出现在General Setup里面,有时候出现在boot option里面。


启动参数相关的函数

early_param,这个函数在kernel启动之后通过parse_early_param来解析
__setup,这个函数在kernel启动之后通过parse_args来解析


常见的启动参数

earlyprintk

在arch/arm/kernel/early_printk.c文件中

static void early_write(const char *s, unsigned n)
{
        while (n-- > 0) {
                if (*s == '\n')
                        printch('\r');
                printch(*s);
                s++;
        }
}

static void early_console_write(struct console *con, const char *s, unsigned n)
{
        early_write(s, n);
}

static struct console early_console_dev = {
        .name =         "earlycon",
        .write =        early_console_write,
        .flags =        CON_PRINTBUFFER | CON_BOOT,
        .index =        -1,
};

static int __init setup_early_printk(char *buf)
{
        early_console = &early_console_dev;
        register_console(&early_console_dev);
        return 0;
}

early_param("earlyprintk", setup_early_printk);

上面的early_param会被编译到.init.setup段中,如下,.init.setup段中保存了struct obs_kernel_param结构体,其中early_param的”earlyprintk”会被赋值到struct obs_kernel_param中的str,setup_early_printk会被赋值到struct obs_kernel_param中的setup_func

struct obs_kernel_param {
        const char *str;
        int (*setup_func)(char *);
        int early;
};

#define __setup_param(str, unique_id, fn, early)                        \
        static const char __setup_str_##unique_id[] __initconst         \
                __aligned(1) = str;                                     \
        static struct obs_kernel_param __setup_##unique_id              \
                __used __section(.init.setup)                           \
                __attribute__((aligned((sizeof(long)))))                \
                = { __setup_str_##unique_id, fn, early }

#define __setup(str, fn)                                                \
        __setup_param(str, fn, fn, 0)

当系统起来的时候parse_early_param,最终会调用到do_early_param,他就去解析之前编译到.init.setup段中的struct obs_kernel_param结构体,如果发现cmdline中传来的param和struct obs_kernel_param结构体中的str是匹配的,那么会调用struct obs_kernel_param中的setup_func函数,也就是上面注册的setup_early_printk函数。

static int __init do_early_param(char *param, char *val, const char *unused)
{
        const struct obs_kernel_param *p;

        for (p = __setup_start; p < __setup_end; p++) {
                if ((p->early && parameq(param, p->str)) ||
                    (strcmp(param, "console") == 0 &&
                     strcmp(p->str, "earlycon") == 0)
                ) {
                        if (p->setup_func(val) != 0)
                                pr_warn("Malformed early option '%s'\n", param);
                }
        }
        /* We accept everything at this stage. */
        return 0;
}

所以为了打印内核引导时候的消息,就需要在uboot的启动参数中添加earlyprink,并且在内核的配置中添加CONFIG_DEBUG_LL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckywang1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值