printk的使用

参考文章
https://blog.csdn.net/wwwlyj123321/article/details/88422640
https://blog.csdn.net/m0_46170433/article/details/105263694
https://blog.csdn.net/u010948546/article/details/81437676

printk在内核源码中用来记录日志信息的函数,只能在内核源码范围内使用。用法和printf非常相似
printk函数主要做两件事情:第一件就是将信息记录到log中,而第二件事就是调用控制台驱动来将信息输出
日志级别
printk相比printf来说还多了个:日志级别的设置,用来控制printk打印的这条信息是否在终端上显示的,当日志级别的数值小于控制台级别时,printk要打印的信息才会在控制台打印出来,否则不会显示在控制台!
在我们内核中一共有8种级别,他们分别为

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

控制台级别

#define MINIMUM_CONSOLE_LOGLEVEL  1   /*可以使用的最小日志级别*/
#define DEFAULT_CONSOLE_LOGLEVEL  7 /*比KERN_DEBUG 更重要的消息都被打印*/
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
 
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,/*控制台日志级别,优先级高于该值的消息将在控制台显示*/
/*默认消息日志级别,printk没定义优先级时,打印这个优先级以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制台日志级别,控制台日志级别可被设置的最小值(最高优先级)*/
MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,/* 默认的控制台日志级别*/
};

在进行查看的时候,可以使用命令 cat /proc/sys/kernel/printk来查看这四个值
printk函数使用
在使用printk时我们会将日志级别放到最开始的位置,如

printk(KERN_EMERG "EMERG\n");

我们没有设置日志级别时,会为他设一个默认的日志级别:default_message_loglevel。
当 printk() 中的消息日志级别小于当前控制台日志级别(console_printk[0])时,printk 的信息就会在控制台上显示。

但无论当前控制台日志级别是何值,即使没有在控制台打印出来,可以通过两种方法查看日志
第一种是使用dmesg命令打印。第二种是通过cat /proc/kmsg来打印。
另外如果配置好并运行了 syslogd 或 klogd,没有在控制台上显示的 printk 的信息也会追加到 /var/log/messages.log 中。
日志级别的设置
printk可以根据设置的日志级别来确定这个语句最后是否能够打印出来。例如我们知道我们默认的控制台级别为4,如何才能更改这个控制台级别呢
方法3:修改/proc/sys/kernel/printk文件
将要设置的值写入到/proc/sys/kernel/printk中。我们要先cat /proc/sys/kernel/printk来看一下这个文件中都有什么值。然后我们再写入。其中这里的格式为:控制台的日志级别、默认消息日志级别、最小控制台日志级别和默认控制台日志级别。而我们要设置的就是第一个控制台的日志级别。我们通过echo “W X Y Z” > /proc/sys/kernel/printk 将我们想要设置的四个值写入到/proc/sys/kernel/printk中。
但是这种方法要在成功开启内核后才可以使用。
下面举个例子

任务一:printk的使用
1.查阅资料,了解printk的日志等级,编写简单的内核模块,使用printk设置不同日志等级
2.进入到系统字符终端,运行内核模块,查看不同日志等级的打印结果。
3.调整终端的消息等级 console_loglevel。
# echo 8 4 1 7  > /proc/sys/kernel/printk
4.查看调整过后的结果。

hello.c

#include <linux/module.h>     
#include <linux/kernel.h>  
#include <linux/init.h>      //包含了宏__init和宏__exit
static int __init lkp_init(void)   //lkp_init()是模块初始化函数
{
    /*printk()函数,该函数是由内核定义的,功能与C库中的
      printf()类似,它把要打印的信息输出到终端或者系统日志*/
    printk(KERN_EMERG"Hello,tong1!\n");
    printk(KERN_ALERT"Hello,tong2!\n");
    printk(KERN_CRIT"Hello,tong3!\n");
    printk(KERN_ERR"Hello,tong4!\n");
    printk(KERN_WARNING"Hello,tong5!\n");
    printk(KERN_NOTICE"Hello,tong6!\n");
    printk(KERN_INFO"Hello,tong7!\n");
    printk(KERN_DEBUG"Hello,tong8!\n");
    return 0;
}
static void __exit lkp_cleanup(void) //lkp_cleanup()是模块的退出和清理函数
{
    printk("module exit success\n\n");
 
}
/*是模块编程中最基本也是必需的两个函数*/
module_init(lkp_init);  //向内核注册模块提供新功能
module_exit(lkp_cleanup); //注销由模块提供所有的功能
MODULE_LICENSE("GPL"); //告诉内核该模块具有GNU公共许可证

Makefile

obj-m :=hello.o                  #产生hello模块的目标文件
all:
	make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD) modules    #编译模块
clean:
	make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD) clean      #清理

然后

make

首先知道

ubuntu的终端已经被开发者修改过了,不管什么级别,内核打印信息都不会主动显示,
只有进入虚拟终端才可以看到打印信息。
进入:(fn)ctrl+alt+{F1-F6}
退出:(fn)ctrl+alt+F7

ctrl+alt+f1之后进入这个页面

输入密码的时候,不可以用小键盘。
在tty界面应先登陆自己的账号和密码

在使用Ctrl+Alt+F1 进入终端字符界面后,应先输入本机的名字,然后输入密码。然后就可以像terminal一样,自由操作了
在这里插入图片描述
在这里插入图片描述
调整终端的消息等级 console_loglevel。
# echo 8 4 1 7 > /proc/sys/kernel/printk查看调整过后的结果。

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓平台下的printk函数是Linux内核提供的一个函数,用于在内核中打印信息。它与printf函数类似,可以进行格式化输出,并且可以指定打印级别。在标准的Linux内核开发过程中,可以使用printk函数打印内核消息,将信息保存到/proc/kmsg日志中,并使用cat命令查看这些信息。 在安卓平台下调试内核时,可以利用adb工具与printk函数打印内核消息。通过adb工具连接到设备后,可以使用adb shell命令进入设备的shell环境,然后使用echo命令修改打印级别。例如,可以使用以下命令将打印级别设置为4: echo "新的打印级别 4 1 7" >/proc/sys/kernel/printk 这样就可以通过printk函数打印内核消息,并在设备的日志中查看这些消息。请注意,对于安卓平台,可能需要root权限才能修改打印级别和查看内核消息。 总结起来,安卓平台下的printk函数是用于在内核中打印信息的函数,可以通过adb工具与printk函数配合使用来调试内核,并可以通过修改打印级别来控制打印的信息量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Android系统开发中log的使用方法及简单的原理](https://download.csdn.net/download/weixin_38731075/14883422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [基于adb工具与printk函数调试Android内核](https://blog.csdn.net/whj1317141989/article/details/84799415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值