Linux设备驱动程序——驱动调试printk()

来源:互联网 发布:双色球6保6旋转矩阵 编辑:程序博客网 时间:2024/06/05 12:00

         前一段时间学了一下,printk()打印语句,现在用起来又忘了,看了一下前一段时间做的笔记,不是很详细,所以决定再写一下和printk相关的调试的东西。算是复习一下吧。

          首先,先熟悉一下printk函数,这个函数和printf函数很类似。只不过一个运行在用户态,一个运行在内核态。此外还是要熟悉一下终端,和控制台等几个概念

         首先需要说的是可以通过以下几种途径查看printk()函数的打印信息

          1、直接在终端中使用dmesg命令来查看   这个我自己试了一下这个里面所有级别消息的都能看见

           2、查看/var/log/messages   这个里面除了最后一个级别的其他级别的都能看见,7应该就是控制台级别。

   3、查看/proc/kmsg  这个试了一下,打不开呀,不知道为什么

1、printk及控制台的日志级别

Printk是在内核中运行的像控制台输出显示的函数。内核会先在内核空间中分配一静态缓冲区,作为显示用的空间,然后调用sprintf,格式换显示字符串,最后调用tty_write函数向终端打印信息。

#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/*调试级别的消息*/


extern  int   console_printk[];

#define  console_loglevel  (consle_printk[0])

#define default_message_loglevel (consle_printk[0])

#define minmum_console_loglevel (consle_printk[1])

#define  default_console_loglevel(consle_printk[2])

在没有指定日志级别的情况下:printk语句采用的是级别是DEFAULT_MESSAGE_LOGLEVEL它的定义如下:

#define  DEFAULT_MESSAGE_LGOLEVEL4 /*其实通过这里可以看的出来,这个级别是和警告条件的级别是一致的*/

为了更好的控制不同级别的信息显示在控制台上面,内核设置了控制台的日志级别consle_loglevel,printk日志级别的作用是打印一定级别的消息,与之类似控制台值显示一定级别的消息。当日志的级别小于console_loglevel时,消息才能显示出来。控制台日志的级别定义如下:

#define  MINMUM_CONSLE_LGOLEVEL1  /*这里是可以使用的最小日志的级别*/

#define  DEFAULT_CONSLE_LGOLEVEL7 /*比这个级别小的消息都会打印出来 */

Int consle[_printk[4]=

{

DEFAULT_CONSLE_LGOLEVEL, /*控制台日志级别*/

DEFAULT_MESSAGE_LGOLEVEL , /*没有定义级别的时候,这个是默认的值*/

MINMUM_CONSLE_LGOLEVEL ,/*最小的级别,也即是最高的级别*/

DEFAULT_CONSLE_LGOLEVEL /*默认的控制台级别*/

};

 

通过读写/proc/sys/kernel/printk文件可以读取和修改控制台文件的级别。方法

# cat  /proc/sys/kernel/printk。

       这上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别、默认的控制台日志级别\

       用下面的命令来设置当前的日志级别.

       #echo 8 > /proc/sys/kernel/printk

实验表明
(1)是否打印到messages 文件和console_loglevel 无关,消息重要性为KERN_DEBUG
7时不打印到messages 文件,否则就打印。
(2)不管消息重要性是否小于console_loglevel,只要重要性不为KERN_EMERG,就
不会打印到console,说明在GNOME 图形界面下消息只会发到messages 文件,一般是不会
到console 上的。(这个应该是在X-window下面的吧,要不就和上面的矛盾了)