首页 > 编程知识 正文

linux内核深度解析,println与print的区别 printf

时间:2023-05-05 09:52:02 阅读:165151 作者:1819

调试linux驱动程序时,通常使用printk函数作为调试手段输出重要信息。 但是,你有没有想过内核中的printk是如何打印在我们的串行控制台上的? 我们既然要看printk函数,首先跟着printk函数往下走,分析printk函数的实现。

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

intprintk(constchar*fmt,) printk函数) printk.c ) vprintk_func ) fmt,args )定义; //宏定义(internal.h ) vprintk _ default (fmt,args ); r=vprintk_Emit(0,LOGLEVEL_DEFAULT,NULL,0,fmt,args ); vcnprintf(text,sizeof ) textbuf )、fmt、args ); //首先在临时buffer console_unlock (中输入输出信息; //call_console_drivers(level,ext_text,ext_len,text,len ); con-write(con,text,len ); 通过上面的代码分析,printk最终将调用控制台的write函数。 那么,这个write函数是如何实现的呢?

2 .注册console console _ init call (cdns _ UART _ console _ init ); //注册内核模块register _ console (cdns _ UART _ console ); 根据从bootargs传递的参数匹配信息,选择console.write=cdns _ UART _ console _ write,write操作uart_console_write(port,port ) 实现s//向串行端口发送字节数据并注册控制台后,驱动器代码会将console_cmdline信息与当前控制台名称进行比较,并在匹配时成功注册控制台。

for(I=0,c=console_cmdline; i MAX_CMDLINECONSOLES c-name[0]; I,c () if (! 新命令匹配||new con-match (new con,c-name,c-index,c-options )!=0()/*默认匹配(/build _ bug _ on ) sizeof(c-name )!=sizeof(newcon-name ); if(strcmp(c-name,newcon-name )!=0)继续; if(newcon-index=0newcon-index!=c-index(continue; if(newcon-index0) newcon-index=c-index; braille _ register _ console (if ) newcon,c ) )返回; 新设置新设置(新设置,c -选项)!=0)空白; }此外,从printk输出的信息存储在缓冲区log_buf中,因此还必须记住,通过查看log_buf可以查看输出信息。此显示命令为dmesg

实际上,名为dmesg的命令的作用是去读名为/proc/kmsg的文件。 这意味着log_buf的内容存储在名为/proc/kmsg的文件中。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。