calltrace
说明
本文基于amba-pl011.c驱动进行分析
怎么使用
- 很简单,使用宏OF_EARLYCON_DECLARE进行earlycon的定义就行了;OF_EARLYCON_DECLARE(pl011, “arm,pl011”, pl011_early_console_setup);
- 在setup中定义打印函数,device->con->write = pl011_early_write;
源码解析
创建与初始化
- earlycon设置的入口是
param_setup_earlycon
,该函数的原理细节是:使用early_param定义,该宏的关键是会把这个结构体放在(.init.setup),在内核启动的时候会遍历整个段,然后进行调用,代码如下:
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);
}
}
- 然后调用到OF_EARLYCON_DECLARE(pl011, “arm,pl011”, pl011_early_console_setup);定义的setup,该宏定义的回调被调用的原理和上面类似(内核常用的方法),定义在
__section(__earlycon_table)
,然后遍历for (p_match = __earlycon_table; p_match < __earlycon_table_end;
,直接使用name比较’if (strncmp(buf, match->name, len))’ - pl011_early_console_setup主要是定义write回调函数
write = pl011_early_write;
,后续会调用到;
使用
直接使用write进行打印con->write(con, text, len);