浅析linux内核printk的原理

通常,在调试linux驱动时,我们常用到printk函数来输出一些关键信息,来作为调试手段。但不知道大家有没有想过,内核中的printk是如何打印到我们的串口控制台的呢?既然我们要看printk函数,就先跟着printk函数往下走,分析printk函数的实现。

1. printk函数

linux内核代码中printk函数位于/kernel/printk/printk.c文件中。

int printk(const char *fmt, ...)    //定义printk函数(printk.c)
    vprintk_func(fmt, args);        //宏定义(internal.h)
        vprintk_default(fmt, args);
            r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
                vscnprintf(text, sizeof(textbuf), fmt, args);//先把输出信息输入到临时buffer
                console_unlock();//
                    call_console_drivers(level, ext_text, ext_len, text, len);
                        con->write(con, text, len);

从上面的代码分析来看,printk最终会调用到console的write函数。那么这个write函数是咋实现的呢?

2. 注册console

console_initcall(cdns_uart_console_init);//注册内核模块
		register_console(&cdns_uart_console);//根据bootargs中传入的参数匹配信息来注册console
			.write	= cdns_uart_console_write,//实现write操作
			uart_console_write(port, s, count, cdns_uart_console_putchar);//按字节把数据发送至串口

注册console时,驱动代码中会将console_cmdline中的信息与当前的控制台名字进行比较,如果匹配上,才会成功注册console。

for (i = 0, c = console_cmdline;
	     i < MAX_CMDLINECONSOLES && c->name[0];
	     i++, c++) {
		if (!newcon->match ||
		    newcon->match(newcon, c->name, c->index, c->options) != 0) {
			/* default matching */
			BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name));
			if (strcmp(c->name, newcon->name) != 0)
				continue;
			if (newcon->index >= 0 &&
			    newcon->index != c->index)
				continue;
			if (newcon->index < 0)
				newcon->index = c->index;

			if (_braille_register_console(newcon, c))
				return;

			if (newcon->setup &&
			    newcon->setup(newcon, c->options) != 0)
				break;
		}

另外还有一点需要牢记的就是,printk输出的信息会先保存在缓冲区log_buf中,所以我们当然可以通过查看log_buf来看输出信息了!而这个查看命令就是:dmesg

实际上,dmesg这个命令的作用就是去读/proc/kmsg这个文件。也就是说log_buf里面的内容是存放在/proc/kmsg这个文件里面的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值