printk的使用与理解

文章目录

  • 一、理清printk
  • 二、printk的使用
  • 三、printk的打印级别
    • 1、基本解释
    • 2、详细解释
    • 3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值
  • 四、printk的输出地方
  • 五、其它

一、理清printk

  • printk如何使用?
  • printk的级别到底是干嘛的?
  • printk除了在控制台输出还能指定其它地方输出吗?

二、printk的使用

驱动程序里经常可以看到printk,那他和常见的printf有啥区别?使用起来没有区别!printk和printf的格式可以说一模一样,比如要打印变量a的值:

//printk
printk("a = %d\n", a);//printf
printf("a = %d\n", a);

但不一样的是printk可以手动指定打印级别,指定级别时写法如下:
在字符串前面加上指定的宏,KERN_WARNING是其中的一个宏

//printk 带打印级别
printk(KERN_WARNING"a = %d\n", a);

三、printk的打印级别

1、基本解释

在这里插入图片描述
图片上可以看到KERN_WARNING的打印级别为4,相关的宏总共有8个,也就是打印级别可以分为0-7,数字越小级别越高。那有两个问题,使用printk时不指定打印级别的话它的默认级别是多少,还是说没有级别?这些级别的用处体现在哪?
回答第一个问题:使用printk时若没有明确指定打印级别,内核会在语句处理前添加默认的打印级别:“4”;
回答第二个问题:现在我们知道了,每条printk语句都有自己的打印级别,要不就是手动指定的要不就是内核添加的,当该级别小于某个阈值时,内核才会打印该信息;若该级别大于该阈值时,则不打印该信息,注意,仅仅只是不打印而已。是可以执行dmesg命令查看以前被隐藏的打印信息的。

总结:每个printk都有自己的打印级别,打印级别用来控制该语句打不打印。

2、详细解释

include/linux/printk.h中有四个宏,其介绍如下:

//include/linux/printk.h
#define console_loglevel 		 (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])

console_loglevel当printk所指定的打印级别小于console_loglevel时,信息才会被打印;
default_message_loglevel当使用printk时没有指定打印级别、内核为其使用的默认级别就是来自default_message_loglevel;
minimum_console_loglevel :是一个预设值,平时不起作用。通过其他工具来设置console_loglevel的值时,这个值不能小于minimum_console_logleve;(引用韦东山教程原话)
default_console_loglevel :也是一个预设值,平时不起作用。它表示设置console_loglevel时的默认值,通过其他工具来设置console_loglevel的值时,用到这个值;(引用韦东山教程原话)
console_printk[]数组:定义如下

//include/linux/printk.c
int console_printk[4] = {CONSOLE_LOGLEVEL_DEFAULT,	/* console_loglevel */MESSAGE_LOGLEVEL_DEFAULT,	/* default_message_loglevel */CONSOLE_LOGLEVEL_MIN,		/* minimum_console_loglevel */CONSOLE_LOGLEVEL_DEFAULT,	/* default_console_loglevel */
};

3、如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel的值

printk的打印级别我们已经知道如何指定了,就是printk语句里加入相关表示级别的宏即可,内核会判断其等级是否小于console_loglevel,小于则打印,大于等于则不打印;那又如何修改console_loglevel、default_message_loglevel、minimum_console_loglevel、default_console_loglevel呢?
回答:直接修改/proc/sys/kernel/printk文件来改变这4个值;

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

左边第一个 1 代表 console_loglevel;
左边第二个 4 代表 default_message_loglevel;
左边第三个 1 代表 minimum_console_loglevel;
左边第四个 7 代表 default_console_loglevel;
像上面这个例子,打印等级是1,默认等级是4,如果使用printk不指定打印等级的话,则使用默认等级4,4并不小于1,则该信息不会打印;

四、printk的输出地方

在设备树中的bootargs指定console即可,如下,也可指定多个console,

# 单个console
/ {chosen {bootargs = "console=ttymxc1,115200";};
};# 多个console
/ {chosen {bootargs = "console=ttymxc1,115200 console=ttymxc2";};
};

无论是在uboot时填写的bootargs还是在哪,最后都会更新在设备树; (引用他人结论,未实验)

五、其它

文章中出现的名词解释或个人理解若有误,恳请指出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/340841.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

讲讲关于跨域的问题,什么是跨域?怎么办?

文章目录 什么是跨域如果非同源,共有三种行为受到限浏览器客户端和向服务器跨域请求的判定流程 跨域问题演示参考 以下内容为我结合他人知识进行的自我总结, 如有错误欢迎指出~ 什么是跨域 跨域就是不同的域名下的资源访问,会被浏览器的本地安全策略阻…

【Python学习】Python学习13-日期和时间

目录 【Python学习】Python学习13-日期和时间 前言通过time 获取时间戳时间元组获取当前时间,格式化时间格式化时间转换python中时间日期格式化符号获取日历Time 模块日历(Calendar)模块其他模块参考 文章所属专区 Python学习 前言 本章节主…

开源知识库工具推荐:低成本搭建知识库

在信息爆炸的时代,企业和个体对知识的存储和管理需求日益增强。开源知识库工具因其开源、免费、高效的特性,成为了众多组织和个人的首选。如果你正在寻找一款优秀的开源知识库工具,本文将为你推荐三款性能优异的产品,感兴趣就往下…

小马识途:十个营销故事 启发营销思路

在营销过程中,优势是相对的,只有凭借着客观的营销环境创造优势才能够取胜市场。在企业营销中,狗猛酒酸的案例比比皆是。接下来,就与小马识途一起来看看十个经典的营销故事吧! 一、摩托车公司 有家德国摩托车公司&…

Ubuntu系统中指定端口防火墙状态查询与操作

浏览器访问: 如果遇到如山图所示的情况,既有可能是防火墙的问题。具体解决方案参照如下: 1.指定端口的防火墙状态查询 (1)查询命令 sudo ufw status | grep 8081/tcp #其中8081为要查询的端口号 如果端口是打开的…

【vue3中状态管理工具pinia的使用】pinia状态一(state)

1、安装 yarn add pinia//或者//npm install pinia2、在main.js中引入store // 引入piniaimport { createPinia } from piniaconst pinia createPinia()// 使用piniaapp.use(pinia)3、创建一个Store 在项目根目录的 src文件夹 —— 创建store文件夹 —— 创建 index.js 文件 …

VTK开发调试环境下载(VTK开发环境一步到位直接开发,无需自己配置编译 VS2017+Qt5.12.10+VTK)

一、无与伦比的优势 直接下载代码就可以调试的VTK代码仓库。 二、资源制作原理 这个资源根据VTK源码 编译出动态库文件 pdb lib dll 文件( x64 debug ) 并将这两者同时放在一个代码仓库里,下载就能用。 三、使用方法(vtk-so…

C语言实现简易n子棋小游戏(代码含注解)

利用C语言简单实现一个n子棋小游戏,棋盘大小由自己定义 将源文件分为 执行游戏的测试文件(test.c)和保存游戏运行逻辑的相关函数的文件(game.c) 头文件中声明符号和函数的定义(game.h) 游戏执行主要依靠二维数组实现,电脑走棋采用随机值的方法简易地…

鸿蒙原生应用再添新丁!万达 入局鸿蒙

鸿蒙原生应用再添新丁!万达 入局鸿蒙 来自 HarmonyOS 微博1月11日消息,#万达酒店及度假村启动鸿蒙原生应用及元服务开发# 作为具有中国特色的国牌服务酒店标杆之一,万达酒店及度假村Wanda 将带来全新的服务和交互方式,一步获取“…

Vue3 + TS + Element-Plus —— 项目系统中封装表格+搜索表单 十分钟写五个UI不在是问题

前期回顾 纯前端 —— 200行JS代码、实现导出Excel、支持DIY样式,纵横合并-CSDN博客https://blog.csdn.net/m0_57904695/article/details/135537511?spm1001.2014.3001.5501 目录 一、🛠️ newTable.vue 封装Table 二、🚩 newForm.vue …

离散数学3

补变元 解释:它是以反^作为一组一组的,因此,对于P反^Q来说,P是一组,Q是一组,又有以下:对缺少变元的项要补齐,P缺少Q,Q缺少P。因此,补齐。 用分配律展开 解释&…

数据库用户密码修改时间和密码加密值查询(DM8:达梦数据库)

DM8:达梦数据库用户密码加密值查询 环境介绍1 查询达梦数据库密码修改时间与加密值2 查询数据库密码相同的用户3 达梦数据库学习使用列表 环境介绍 要查询用户密码修改时间,用第一个sql;要查询哪些数据库用户密码是一样的,用第二个sql;若忘记达梦数据库用户密码,1 可以试错,2 …