精华内容
下载资源
问答
  • 网上有原理说明,内核中有示例代码。 unsigned int status; status = port->serial_in(port, UART_LSR); printk_limited(KERR "LSR = %x\n", status); 注意调用的位置,位置不当易导致内核卡死。 原因待查...

    记住printk_ratelimited就好,

    网上有原理说明,内核中有示例代码。

    unsigned int status;

    status = port->serial_in(port, UART_LSR);

    printk_limited(KERR "LSR = %x\n", status);

     

    注意调用的位置,位置不当易导致内核卡死。

    原因待查。

    展开全文
  • 内核开发调试printk

    2020-11-24 21:44:37
    在进行驱动开发的过程往往要打印一些信息来查看是否正确类似于printf,以下将介绍在内核开发常用的调试方法。.(第一次写文章,内容可能不咋样勿喷呀) 内容 一、printk介绍 二、如何查看并修改消息级别 在应用...

    进行内核开发调试

    在进行驱动开发的过程中往往要打印一些信息来查看是否正确类似于printf,以下将介绍在内核开发常用的调试方法。.(第一次写文章,内容可能不咋样勿喷呀)

    内容

    一、printk介绍
    二、如何查看并修改消息级别

    在应用程序采用printf打印调试、内核驱动采用printk打印调试。
    printk函数打印数据到console缓冲区,打印的格式方类似printf。

    printk函数说明
    头文件:<linux/kernel.h>

    int printk(KERN_XXX const char *fmt , …)
    @param[in] fmt 格式化参数,如:%d
    @return 打印出来的字符个数

    例子:

    printk(“hello_init\n”);
    printk(“hello_init = %d\n”,i);
    printk(KERN_ALERT"hello_init=%d\n",i);
    printk("<1>"“hello_init=%d”,i);
    KERN_ALERT 等效于“<1>”
    通过修改KERN_ALERT来修改优先级

    优先级打印级别 0最高,7最低
    0、 KERN_EMERG “<0>” 用于紧急消息, 常常是那些崩溃前的消息
    1、 KERN_ALERT “<1>” 需要立刻动作的情形
    2、 KERN_CRIT “<2>” 严重情况, 常常与严重的硬件或者软件失效有关
    3、 KERN_ERR “<3>” 用来报告错误情况; 设备驱动常常使用 KERN_ERR 来报告硬件故障
    4、 KERN_WARNING “<4>” 有问题的情况的警告, 这些情况自己不会引起系统的严重问题
    5、 KERN_NOTICE “<5>” 正常情况, 但是仍然值得注意. 在这个级别一些安全相关的情况会报告
    6、 KERN_INFO “<6>” 信息型消息. 在这个级别, 很多驱动在启动时打印它们发现的硬件的信息
    7、 KERN_DEBUG “<7>” 用作调试消息

    格式化符

    符合说明
    %d十进制打印
    %x十六进制
    %u无符号整数
    %lu无符号长整数
    %lx十六进制无符号长整数
    %lld64bit整数值
    %llx64bit16进制整数值
    %zusize_t 10进制打印
    %zxsize_t 16进制打印
    %zdssize_t 10进制打印
    %p指针原值输出

    日志守护进程
    【klogd&syslogd】

    klogd	内核日志守护进程,将内核消息放入/var/log/messages中
    syslogd	系统日志守护进程,将程序消息放入/var/log/messages中
    

    通过命令#dmesg 可以查看消息
    也可以通过命令cat /var/log/messages查看消息

    【console_loglevel】
    if (打印消息级别 < console_loglevel)
    打印到当前控制台

    可以通过读/proc/sys/kernel/printk来查看控制台消息级别
    如,# cat /proc/sys/kernel/printk 出现 4 4 1 7
    该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。上面显示的4个数据分别对应:
    1、控制台日志级别:优先级高于该值的消息将被打印至控制台
    2、默认的消息日志级别:将用该优先级来打印没有优先级的消息(未指定日志级别的printk() 采用的默认级别 )
    3、最低的控制台日志级别:控制台日志级别可被设置的最小值(最高优先级)
    4、默认的控制台日志级别:控制台日志级别的缺省值

    可以通过写 /proc/sys/kernel/printk 来修改控制台消息级别
    了解了上面的这些知识后,我们就应该知道如何手动控制printk打印了。
    例如,我想屏蔽掉所有的内核printk打印,那么我只需要把第一个数值调到最小值1或者0。

    方法一:
    #echo 1 4 1 7 > /proc/sys/kernel/printk
    方法二:
    #klogd -c 1

    …写得很乱

    展开全文
  • 内核中printk printk与printf的用法是差不多的,最大的区别就是printk可以指定打印的优先 级。另外一个区别就是,printf只用在用户态,printk用于内核态。 /* printk’s without a loglevel use this… */ #define...

    内核中的printk

    printk与printf的用法是差不多的,最大的区别就是printk可以指定打印的优先 级。另外一个区别就是,printf只用在用户态,printk用于内核态。

    /* printk’s without a loglevel use this… */
    #define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL //menuconfig 可配置

    /* We show everything that is MORE important than this… /
    #define MINIMUM_CONSOLE_LOGLEVEL 1 /
    Minimum loglevel we let people use /
    #define DEFAULT_CONSOLE_LOGLEVEL 7 /
    anything MORE serious than KERN_DEBUG */

    int console_printk[4] = {
    DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel / -可在运行后修改
    DEFAULT_MESSAGE_LOGLEVEL, /
    default_message_loglevel /
    MINIMUM_CONSOLE_LOGLEVEL, /
    minimum_console_loglevel /
    DEFAULT_CONSOLE_LOGLEVEL, /
    default_console_loglevel */

    };

    /dav # cat /proc/sys/kernel/printk
    10 1 1 7
    /dav # echo 8 > /proc/sys/kernel/printk
    /dav # cat /proc/sys/kernel/printk
    8 1 1 7
    /dav # echo 10 > /proc/sys/kernel/printk
    /dav # cat /proc/sys/kernel/printk
    10 1 1 7

    下面由程序讲解

    /2nd_module/2nd/

    1 #include

    2 #include

    3

    4 static int __init test_init(void)

    5 {

    6 printk(“hello world!\n”);

    7 printk("<0>" “hello world! 0\n”);

    8 printk("<1>" “hello world! 1\n”);

    9 printk("<2>" “hello world! 2\n”);

    10 printk("<3>" “hello world! 3\n”);

    11 printk("<4>" “hello world! 4\n”);

    12 printk("<5>" “hello world! 5\n”);

    13 printk("<6>" “hello world! 6\n”);

    14 printk("<7>" “hello world! 7\n”);

    15 return 0;

    16 }

    17

    18 static void __exit test_exit(void)

    19 {

    20 printk(“good bye!\n”);

    21 }

    22

    23 module_init(test_init);

    24 module_exit(test_exit);

    25

    26 MODULE_LICENSE(“GPL”);

    27 MODULE_AUTHOR(“xiao bai”);

    28 MODULE_VERSION(“1.0”);

    编译后加载模块,发现输出内容为:

    [root: 2nd]# insmod test.ko

    hello world!

    hello world! 0

    hello world! 1

    hello world! 2

    hello world! 3

    hello world! 4

    hello world! 5

    hello world! 6

    输出唯独缺少了最后一个"hello world! 7",这是因为printk输出优先级的导致 的。printk的优先级如下,在内核目录下inxlude/linux/kernel.h下有记录:

    91 #define KERN_EMERG “<0>” /* system is unusable */

    92 #define KERN_ALERT “<1>” /* action must be taken immediately */

    93 #define KERN_CRIT “<2>” /* critical conditions */

    94 #define KERN_ERR “<3>” /* error conditions */

    95 #define KERN_WARNING “<4>” /* warning conditions */

    96 #define KERN_NOTICE “<5>” /* normal but significant condition */

    97 #define KERN_INFO “<6>” /* informational */

    98 #define KERN_DEBUG “<7>” /* debug-level messages */

    其中<0>的优先级最高,<7>优先级最低。上面的printk语句的优先级都可以用字符 串代替,如下面两句是同等作用的:
    p { margin-bottom: 0.21cm; }

    printk("<3>" “hello world! 3\n”);

    printk(KERN_ERR “hello world! 3\n”)

    如果调用printk使用的优先级低于或等于控制台的默认优先级,就不能被输出到 控制台终端上显示,所以在minicom界面中看不到最后一句的输出。

    按照以上的推测,可以得到两个结论:

    一、如果不指定prinfk的优先级,prinfk的默认优先级比控制台的优先级高,所 以才能显示在控制台上。

    二、控制台的优先级是6,因为低于6优先级的语句不能打印出来。

    printk的默认优先级在内核目录kernel/printk.c定义:

    47 /* printk’s without a loglevel use this… */

    48 #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

    49

    50 /* We show everything that is MORE important than this… */

    51 #define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */

    52 #define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG*/

    文件中定义了printk的默认输出优先级为4,并定义了一般使用的最大和最小优先 级1和7。

    而终端控制台的输出优先级配置在文件/proc/sys/kernel/printk中:

    [root: /]# cat /proc/sys/kernel/printk

    7 4 1 7

    7 4 1 7分别是:

    7:console_loglevel //这个就是控制台的默认优先级

    4:default_message_loglevel // 这个是printk的默认输出优先级

    1:minimum_console_level

    7:default_console_loglevel

    可以通过修改该文件使所有优先级的消息都显示出来。

    [root: /]# echo 8 > /proc/sys/kernel/printk

    注意的是,即使没有显示在控制台的内核消息,也会追加到/var/log/messages,通过查看/var/log/messages就能看到。

    作者:xushx_bigbear
    来源:CSDN
    原文:https://blog.csdn.net/xushx_bigbear/article/details/49949631
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 内核打印函数printk

    千次阅读 2017-09-12 15:51:05
    printk函数以及内核打印级别介绍

    printk VS printf:

    相同点:都是用于打印输出信息,使用一致
    不同点:前者在内核中使用,后者在应用程序中使用

    printk函数的特点

    1.能够指定打印输出级别,有0~7共8级

    使用案例:
    printk (KERN_ERR, “this is a error message\n”);
    printk (“<3>”, “this is a error message\n”) ;

    指定打印输出级别的目的就是为将来有些信息能够做输出处理;此时需要指定一个默认的打印输出级别来指定信息是否需要输出到终端上:

    如果默认的打印输出级别比如为4,那么printk指定的打印输出级别如果小于4,那么信息一律输出到终端上;
    如果printk指定的打印输出级别大于等于4,那么信息一律不做输出;

    默认的打印输出级别如何设置呢?

    默认的打印输出级别的设置方法有两种

    方法1:
    通过修改配置文件来指定默认的打印输出级别
    /proc/sys/kernel/printk
    方法2:
    第一种方法虽然能够设置默认的打印输出级别,但是对于内核启动时的打印输出信息,这种方法不能使用;
    并且/proc目录作为procfs虚拟文件系统的入口, /proc目录下的内容都是存在于内存中,掉电就丢失。
    对于内核的启动信息,可以利用方法2来指定:
    实施步骤:
    只需要在内核的启动参数中添加以下选项即可: debug / quiet / loglevel=数字

    编写内核程序, 掌握printk的使用

    实施步骤:
    1.mkdir /opt/drivers/4.0
    2.cd /opt/drivers/4.0
    3.vim printk_all.c
    4.vim Makefile
    5.make
    6.cp printk_all.ko /opt/rootfs

    ARM执行:
    1.insmod printk_all.ko
    2.rmmod printk_all
    3.cat /proc/sys/kernel/printk //获取默认的打印输出级别
    7(默认终端打印输出级别) 4 1 7
    4.echo 8 > /proc/sys/kernel/printk
    5.insmod printk_all.ko
    6.rmmod printk_all

    printk_all.c如下:

    #include <linux/init.h>
    #include <linux/module.h>
    
    static int printkall_init(void)
    {
        printk("<0>" "level 0!\n");
        printk("<1>" "level 1!\n");
        printk("<2>" "level 2!\n");
        printk("<3>" "level 3!\n");
        printk("<4>" "level 4!\n");
        printk("<5>" "level 5!\n");
        printk("<6>" "level 6!\n");
        printk("<7>" "level 7!\n");
        return 0;
    }
    
    static void printkall_exit(void)
    {
        printk("<0>" "level 0!\n");
        printk("<1>" "level 1!\n");
        printk("<2>" "level 2!\n");
        printk("<3>" "level 3!\n");
        printk("<4>" "level 4!\n");
        printk("<5>" "level 5!\n");
        printk("<6>" "level 6!\n");
        printk("<7>" "level 7!\n");
    
    }
    module_init(printkall_init);
    module_exit(printkall_exit);
    MODULE_LICENSE("GPL");
    展开全文
  • 内核日志及printk结构浅析
  • 内核级打印Printk

    千次阅读 2012-05-22 08:27:16
    概述   对于做嵌入式或者熟悉... printk是在内核中运行的向控制台输出显示的函数,Linux内核首先在内核空间分配一个静态缓冲区,作为显示用的空间,然后调用sprintf,格式化显示字符串,最后调用tty_write向终端进
  • linux 内核 printk 使用

    2015-03-30 11:08:00
    在linux 内核打印语句 printk() 会将内核信息输出到内核信息缓冲区内核信息缓冲区是一个环形 缓冲区(ring buffer),因此,如果插入的信息过多,就会将之前的信息冲刷掉。 printk() 定义了8个消息级别...
  • 内核打印调试printk学习笔记Printk打印格式与打印等级打印数据打印等级日志级别(loglevel)修改控制台打印等级控制台、终端和串口之间的关系终端(terminal)与控制台(console)控制台与串口嵌入式平台下的console查看和...
  • 分析Linux内核启动流程时可以知道,在调用setup_arch函数之前就已经调用过printk函数了,但是这个时候的printk函数只是将打印信息放在缓存区,并没有打印到控制台上,因为这个时候控制台还没有被初始化。...
  • Linux 内核调试之 printk

    千次阅读 2015-06-09 20:15:07
    问题描述:最近这两天再调试 platform 驱动,程序老是有点小问题,得不到自己想要的结果,突然意识到内核调试重要性,重新整理一下 printk 基本用法。内核通过 printk() 输出相关信息,在调用 printk() 函数时必须要...
  • &#13; printk()函数是直接使用了向终端写函数...所以在用户态(如进程0)不能够直接使用printk()函数,而在内核态由于他已是特权级,所以无需系统调用来改变特权级,因而能够直接使用printk()函数。 ...
  •  这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结。 一、printk概述  对于做Linux内核开发的人来说,printk实在是再熟悉不过了。内核启动时显示...
  • linux 内核打印函数 printk 用法

    千次阅读 2019-10-22 10:57:17
    printk在内核源码用来记录日志信息的函数,只能在内核源码范围内使用。用法和printf非常相似 printk函数主要做两件事情:第一件就是将信息记录到log,而第二件事就是调用控制台驱动来将信息输出。 1.日志...
  • 这段时间复习了一下内核调试系统,注意看了一下printk的实现以及内核日志的相关知识,这里做一下总结。 1、问题的引出: 做DPDK项目时,调试rte_kni.ko时,发现printk并不会向我们想想的那样把log信息显示在我们的...
  • 在Linux内核中没有printf函数,那么内核是怎么打印调试信息的呢,这里我们用到的是printk函数,在内核中想要向控制台输出或者显示一些内容,必须需要printk函数,这个函数。不同之处在于, printk可以根据日志级别对消息...
  • 禁止内核打印内核信息(printk

    千次阅读 2013-11-05 14:51:44
    echo 0 > /proc/sys/kernel/printk
  • Linux内核打印函数printk使用说明

    千次阅读 2008-06-01 21:48:00
    printk函数 We used the printk function in earlier chapters with the simplifying assumption that it works like printf. Now its time to introduce some of the differences. 我们...
  • 内核调试函数printk()

    2013-12-23 22:57:28
    内核模式下系统信息输出函数printk() 与用户模式下printf()函数在输出内容上是有区别的,第一:内核在切换模式时不保存处理器的浮点状态,因此printk()并不支持浮点数运算;第二:printk()可以指定一个记录级别,...
  • %pF可打印函数指针的函数名和偏移地址,%pf只打印函数指针的函数名,不打印偏移地址 所以只要内核能够编译和运行,找不到挂接的函数指针都无处遁形。...printk 使用方法 https://haohetao.iteye.com/blog/1147791 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,162
精华内容 19,664
关键字:

内核中使用printk