内核printk打印等级

为了确认内核打印等级以及prink 参数对打印的分级,在led驱动初始化代码【以及exit出口】加入如下代码。

每次insmod 、rmmod led模块时,根据打印等级的设置,得到不同的打印结果:

  1. static int __init s3c24xx_leds_init()
  2. {
  3.     int ret ;
  4.     int minor = 0 ;
  5.  
  6.    printk(KERN_EMERG " 1111111 KERN_EMERG\n");
  7.    printk(KERN_ALERT " 2222 KERN_ALERT\n");
  8.    printk(KERN_CRIT " 3333333 KERN_CRIT\n");
  9.    printk(KERN_ERR " 44444444 KERN_ERR\n");
  10.    printk(KERN_WARNING " 55555 KERN_WARNING\n");
  11.    printk(KERN_NOTICE " 66666 KERN_NOTICE\n");
  12.    printk(KERN_INFO " 77777 KERN_INFO\n");
  13.    printk(KERN_DEBUG " 888888 KERN_DEBUG\n");
  14.    printk(" 9999 no_fix\n");
  15. }

操作:

一次性地设置编译内核源码时默认的打印级数:【它们在kernel/printk.c中定义】

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

8. 为KERN_DEBUG

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

# insmod myleds_new.ko

1111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

44444444 KERN_ERR

55555 KERN_WARNING

66666 KERN_NOTICE

77777 KERN_INFO

888888 KERN_DEBUG

9999 no_fix

7. 为默认

#cat /proc/sys/kernel/printk

  #7 4 1 7

打印结果:

111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

44444444 KERN_ERR

55555 KERN_WARNING

66666 KERN_NOTICE

77777 KERN_INFO

9999 no_fix

6.

# echo 6 4 1 7 > /proc/sys/kernel/printk

# insmod myleds_new.ko

1111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

44444444 KERN_ERR

55555 KERN_WARNING

66666 KERN_NOTICE

9999 no_fix

5.

# echo 5 1 4 7 > /proc/sys/kernel/printk

# rmmod myleds_new.ko

1111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

44444444 KERN_ERR

55555 KERN_WARNING

9999 no_fix

4.

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

# insmod myleds_new.ko

1111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

44444444 KERN_ERR

3.

# echo 3 4 1 7 > /proc/sys/kernel/printk

# rmmod myleds_new.ko

1111111 KERN_EMERG

2222 KERN_ALERT

3333333 KERN_CRIT

2.

# echo 2 4 1 7 > /proc/sys/kernel/printk

# insmod myleds_new.ko

1111111 KERN_EMERG

2222 KERN_ALERT

1.

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

# insmod myleds_new.ko

1111111 KERN_EMERG

分析:

手动设置打印等级为5 1 4 7 及其以上时(重启会失效),会打印KERN_WARNING 以及没有加格式参数的printk打印信息。

KERN_DEBUG优先级最低。

KERN_EMERG优先级最高。

其它的,按级数递推。

假设要默认打印无fix的printfk,

kernel/printk.c

#define DEFAULT_CONSOLE_LOGLEVEL (XX); xx >=5

假设要默认打印KERN_DEBUG信息

#define DEFAULT_CONSOLE_LOGLEVEL (XX); xx=8

//上述操作,一次性的可以使用echo xx 4 1 7 > /proc/sys/kernel/printk

源代码参考:

kernel/printk.c

  1. /* printk‘s without a loglevel use this.. */
  2. #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
  3.  
  4. /* We show everything that is MORE important than this.. */
  5. #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
  6. #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
  7.  
  8. DECLARE_WAIT_QUEUE_HEAD(log_wait);
  9.  
  10. int console_printk[4] = {
  11.    DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */
  12.    DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */
  13.    MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */
  14.    DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */
  15. };

Include/linux/kernel.h

  1. #define KERN_EMERG "<0>" /* system is unusable */
  2. #define KERN_ALERT "<1>" /* action must be taken immediately */
  3. #define KERN_CRIT "<2>" /* critical conditions */
  4. #define KERN_ERR "<3>" /* error conditions */
  5. #define KERN_WARNING "<4>" /* warning conditions */
  6. #define KERN_NOTICE "<5>" /* normal but significant condition */
  7. #define KERN_INFO "<6>" /* informational */
  8. #define KERN_DEBUG "<7>" /* debug-level messages */
时间: 2024-08-30 13:09:33

内核printk打印等级的相关文章

C语言:类似linux内核的分等级DEBUG宏(打印宏)

总结几种log打印printf函数的宏定义 http://blog.chinaunix.net/uid-20564848-id-73402.html #include <stdio.h> #define lU_DEBUG_PREFIX "##########" #define LU_DEBUG_CMD 0x01 #define LU_DEBUG_DATA 0x02 #define LU_DEBUG_ERROR 0x04 #define LU_PRINTF_cmd(msg..

更改printk打印级别

1.查看当前控制台的打印级别 cat /proc/sys/kernel/printk 4    4    1    7 其中第一个"4"表示内核打印函数printk的打印级别,只有级别比他高的信息才能在控制台上打印出来,既 0-3级别的信息 2.修改打印 echo "新的打印级别  4    1    7" >/proc/sys/kernel/printk 3.不够打印级别的信息会被写到日志中可通过dmesg 命令来查看 4.printk的打印级别 #defi

屏蔽内核启动打印信息

最近做的4412板子终于经过测试形成产品,在这之前需要把内核启动过程中的打印信息去掉,并且更换启动LOGO,下面讲讲自己去掉打印信息的过程. 去掉打印信息方法很多,我使用一个相对比较简单的,就是将下面选项的[*]去掉 Device Drivers  ---> Character devices  ---> [* ]   Support for console on virtual terminal 这样printk的打印信息就不会输出在显示器或LCD上. 将打印信息去掉后,莫名其妙的会出现因为

Linux内核printk实现

基于MTK 6595分析,内核版本3.10.5 1 Printk函数分析 内核为Printk维护一个环形缓冲区,其大小为: #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) 大小可以通过CONFIG_LOG_BUF_SHIFT去控制 1.1函数原型如下: asmlinkage int printk(const char *fmt, ...) { va_listargs; intr; va_start(args,fmt); r= vprintk_

linux 内核 printk 使用

在linux 中,内核打印语句 printk() 会将内核信息输出到内核信息缓冲区中.内核信息缓冲区是一个环形 缓冲区(ring buffer),因此,如果插入的信息过多,就会将之前的信息冲刷掉. printk() 定义了8个消息级别,分为级别0 ~ 7,级别越低(数值越大)的消息越不重要,第0级是紧急事件, 第7级是调试级,在内核中 include/linux/printk.h 中的定义如下: #define KERN_EMERG "<0>" /* system is u

Linux内核源码学习之 内核页表打印

本学期Linux内核实验最后是打印内核页表,线性地址----物理地址 我看到这个实验题目的时候想到的就是这个init函数(因为这部分当时就是我讲的^_^),这个函数是初始化linux内核页表的,也就是将32位系统中3G以上的896M线性地址映射到物理地址的0-896M,在其调用者paging_init函数中还处理了其他的情况,比如固定映射之类的.那属于高端内存映射那一块的内容,目前我们先看一下如何将内核页表3G~3G+896M的线性地址对应的物理地址打印出来. 一下的源码是linux2.6.11

转 在Linux内核中打印日志时间戳

在编译Linux内核,配置时:make menuconfig ---> Kernel hacking --> printk and dmesg options --> show timing information on printks 当选中这个选项后,启动内核,会在日志信息前面加上时间戳. 从下面的输出可以看出,时间精确到微秒(us). 如下: ----------------------------------------------------------------------

Samsung_tiny4412(笔记)--&gt;字符设备驱动基本操作及调用流程

/*********************************************************************************** * * Samsung_tiny4412(笔记)-->字符设备驱动基本操作及调用流程 * * 声明: * 以下所有的shell命令都是在root权限下运行的; * * 2015-3-7 阴 深圳 尚观 Sbin 曾剑锋 *******************************************************

rsyslog netconsole(debian)二

netconsole is a kernel module that sends all kernel log messages (i.e. dmesg)  over the network to another computer,without involving user space (e.g. syslogd). Name "netconsole" is a misnomer because its not really a "console", more l