看下printk的实现
asmlinkage __visible int printk(const char *fmt, ...)
{
r = vprintk_func(fmt, args);
}
__printf(1, 0) int vprintk_func(const char *fmt, va_list args)
{
return vprintk_default(fmt, args);
}
int vprintk_default(const char *fmt, va_list args)
{
r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
}
asmlinkage int vprintk_emit(int facility, int level,const char *dict, size_t dictlen,const char *fmt, va_list args)
{
console_unlock();
}
void console_unlock(void)
{
call_console_drivers(level, text, len);
}
static void call_console_drivers(int level, const char *text, size_t len)
{
struct console *con;
for_each_console(con) {
con->write(con, text, len);
}
}
也就是调用con->write的写接口,把log输出到串口上。
那控制台什么时候注册,以sprd的为例
#define SPRD_TTY_NAME "ttyS"
static struct console sprd_console = {
.name = SPRD_TTY_NAME,
.write = sprd_console_write,
.device = uart

本文深入解析了Linux系统中printk函数的实现原理,详细介绍了其内部调用流程,包括vprintk_func、vprintk_default及vprintk_emit等关键函数的作用。同时,探讨了控制台注册过程和串口输出的具体实现。
最低0.47元/天 解锁文章
2598

被折叠的 条评论
为什么被折叠?



