linux驱动摸索 --printk的使用(结合韦东山视频教程)

1.printk终端显示由谁控制:

          u-boot传入终端显示参数,eg:console = ttySAC0  or console = tty1,内核处理u-boot传入的相关参数。在linux内核源码中搜索“console=”,<printk.c>文件中有如下定义:

    __setup("console=", console_setup);  console_setup()==>__add_preferred_console(),在__add_preferred_console函数中将控制台的name赋值给console_cmdline[i].name,于是找到硬件驱动入口函数\drivers\serial\Samsung.c  的register_console(&s3c24xx_serial_console)
2.printk函数的实现

vprintk
/* Emit the output into the temporary buffer */
// 先把输出信息放入临时BUFFER
vscnprintf

// Copy the output into log_buf.
// 把临时BUFFER里的数据稍作处理,再写入log_buf
// 比如printk("abc")会得到"<4>abc", 再写入log_buf
// 可以用dmesg命令把log_buf里的数据打印出来重现内核的输出信息


// 调用硬件的write函数输出
release_console_sem();
call_console_drivers(_con_start, _log_end);
// 从log_buf得到数据,算出打印级别
_call_console_drivers(start_print, cur_index, msg_level);
// 如果可以级别够格打印
if ((msg_log_level < console_loglevel
__call_console_drivers
con->write(con, &LOG_BUF(start), end - start);


  对于打印级别,内核中有如下定义(在linux26/includelinux/kernel.h中):

#define   KERN_EMERG     "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
#define   KERN_ALERT       "<1>"/*报告消息,表示必须立即采取措施*/
#define   KERN_CRIT          "<2>"/*临界条件,通常涉及严重的硬件或软件操作失败*/
#define   KERN_ERR          "<3>"/*错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/
#define   KERN_WARNING"<4>"/*警告条件,对可能出现问题的情况进行警告*/
#define   KERN_NOTICE    "<5>"/*正常但又重要的条件,用于提醒。常用于与安全相关的消息*/
#define   KERN_INFO         "<6>"/*提示信息,如驱动程序启动时,打印硬件信息*/
#define   KERN_DEBUG    "<7>"/*调试级别的消息*/


没有指定日志级别的printk语句默认采用的级别是 DEFAULT_ MESSAGE_LOGLEVEL(这个默认级别一般为<4>,即与KERN_WARNING在一个级别上),其定义在linux26/kernel/printk.c中可以找到。

下面是一个比较简单的使用

printk(KERN_INFO "INFO\n");  //这里可以使用数字代替 KERN_INFO,即可以写成printk(<6> "INFO\n");  
在这个格式的定义中,日志级别和信息文本之间不能够使用逗号隔开,因为系统在进行编译的时候,将日志级别转换成字符串于后面的文本信息进行连接。


在对系统输出进行控制时,主要是讨论控制台和伪终端的输情况,以及系统日志等。


下面是控制台日志级别的一些简要的介绍
控制台相应的日志级别定义如下:
#define MINIMUM_CONSOLE_LOGLEVEL  1   /*可以使用的最小日志级别*/
#define DEFAULT_CONSOLE_LOGLEVEL  7 /*比KERN_DEBUG 更重要的消息都被打印*/


int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,/*控制台日志级别,优先级高于该值的消息将在控制台显示*/
/*默认消息日志级别,printk没定义优先级时,打印这个优先级以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制台日志级别,控制台日志级别可被设置的最小值(最高优先级)*/
MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,/* 默认的控制台日志级别*/
};
在进行查看的时候,可以使用命令 cat /proc/sys/kernel/printk来查看这四个值
可以通过修改文件/proc/sys/kernel/printk中的第一个值来更改当前的控制台日志级别。

例如:

#cat  /proc/sys/kernel/printk

7   4   1    7

#echo "8 4 1 7" >  /proc/sys/kernel/printk

#cat  /proc/sys/kernel/printk

8   4   1   7


(声明:在下面的模块函数中控制台所使用的日志级别均为KERN_WARNING级别)当日志级别高于console_loglevel(控制台日志级别)时,消息才能在控制台显示出来。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值