IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    内核调试之 printk 打印

    四十九C-137发表于 2023-06-01 15:06:00
    love 0

    printk 函数通常用在 Linux 内核中用于打印信息,可以将打印的信息输出在控制台或者某个文件当中。 与 printf 函数相似。

    案例:

    printk(KERN_WARNING "Hello kernel!\n");

    在内核代码中插入该代码,当内核运行后代码执行至该处时,将会在控制台输出字符 "Hello kernel!" 。

    其中 KERN_CONT 是打印优先级。可用的打印优先级有:

    #define KERN_EMERG      KERN_SOH "0"    /* system is unusable */
    #define KERN_ALERT      KERN_SOH "1"    /* action must be taken immediately */
    #define KERN_CRIT       KERN_SOH "2"    /* critical conditions */
    #define KERN_ERR        KERN_SOH "3"    /* error conditions */
    #define KERN_WARNING    KERN_SOH "4"    /* warning conditions */
    #define KERN_NOTICE     KERN_SOH "5"    /* normal but significant condition */
    #define KERN_INFO       KERN_SOH "6"    /* informational */
    #define KERN_DEBUG      KERN_SOH "7"    /* debug-level messages */
    
    #define KERN_CONT KERN_SOH "c" 

    KERN_SOH 的数字越小,打印优先级越高。

    在内核中插入的 printk 是否打印在控制台中,取决于控制台的打印优先级。可以使用以下命令查看当前控制台的打印优先级:

    # cat /proc/sys/kernel/printk
    7 4 1 7

    这四个数字分别代表

    • 控制台打印优先级:优先级高于该值的printk打印才会输出到控制台重定向的串口或屏幕上
    • 默认的消息打印优先级
    • 最低的控制台打印优先级
    • 默认的控制台打印优先级

    数字越小,优先级越高。

    当控制台的打印优先级(7)低于内核中 printk 的消息打印优先级(KERN_WARNING : 4)时,在内核中的 printk 函数输出都会打印在控制台上。

    可以通过以下命令修改 printk 的打印等级:

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

    或者使用 dmesg 命令:

    # dmesg -n 3

    此时控制台的打印优先级(3)大于内核中 printk 的消息打印优先级(KERN_WARNING : 4),内核中的 printk 函数输出将不会打印在控制台上,而是保存在内核的日志缓存中,可以使用命令 dmesg 查看。



沪ICP备19023445号-2号
友情链接