1.printk的基本原理

其实printk的基本原理我是通过韦东山的视频和一篇CSDN博客了解到的

博客链接贴在下面:

嵌入式Linux——printk:printk打印机制分析_静祥阁-CSDN博客_linux printk

博客写得很详细,该博客主要分为如下几个部分:

printk原理/控制台的选择/printk日志级别的设置

最近我在搞问题的时候,代码中涉及到printk的耗时问题,胡跟我说:将打印级别调一调,不显示到串口就不耗时了

那么我的问题是:调整打印级别,那么printk是不打印了还是实际打印了但是我看不到而已?

printk函数调用的子函数的主要脉络如下图:

从上图可见:红笔隔断,把printk的行为分为两半:将信息记录到log_buf中+调用控制台驱动输出信息

2.将信息记录到log_buf中

实际上vprintk函数中有两个buf

第一个buf: static char printk_buf[1024]; //从这里看printk_buf的大小为1k

这个buf的作用只是将输出信息放入其中:

/* 将输出信息放到printk_buf中,并返回放入字符的个数 */

printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args);

第二个buf:log_buf[65536],这个才是真正的循环缓冲区,如果我们没有为printk设置打印级别,最终会往log_buf[]中添加打印级别的,也就是说,通过emit_log_char()函数往log_buf[65536]中写数据,而最终log_buf[65536]中的数据都是带打印级别的

3.调用控制台驱动输出信息

最终release_console_sem()会呼叫到_call_console_drivers(),从如下代码可以看出:

这里可以调用控制台驱动函数__call_console_drivers(),也可以不调用,调用的前提是msg_log_level<console_loglevel

所以这里回答了我开始的问题:

Q:调整打印级别,那么printk是不打印了还是实际打印了但是我看不到而已?

A:适当吊调整打印级别后,不会再调用控制台驱动输出信息,所以也就看不到打印信息了

/** 输出从start 到 end - 1 之间的信息*/
static void _call_console_drivers(unsigned long start,unsigned long end, int msg_log_level)
{if ((msg_log_level < console_loglevel || ignore_loglevel) &&console_drivers && start != end) {if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {/* wrapped write */__call_console_drivers(start & LOG_BUF_MASK,log_buf_len);__call_console_drivers(0, end & LOG_BUF_MASK);} else {__call_console_drivers(start, end);}}
}

4.后记:printk过多带来的性能问题

CSDN:printk打印log过多会导致performance下降_zhouzhengting1的专栏-CSDN博客

printk 分2个阶段, 第一个阶段是将log放到buff, 第二阶段是将buff数据送到uart。Dump log到uart console是一个同步的操作过程。在此期间,IRQ是被disabled,CPU也是在wait,一直到dump完成。由于此阶段的速度会很慢, 并且会把local的irq disable. 所以会导致local cpu sched, 如果在此cpu 的thread都会被block

5.printk的全局示意图

printk学习之(一):基本原理相关推荐

  1. 【nginx学习一】基本原理初探

    由于性能问题,需要将 apache + php5.2 升级到 nginx + php7,对于nginx的性能和热加载早有耳闻,why nginx so diao.小拽进行了初探,有任何疑问或不准确的地 ...

  2. 深度学习基础-机器学习基本原理

    本文大部分内容参考<深度学习>书籍,从中抽取重要的知识点,并对部分概念和原理加以自己的总结,适合当作原书的补充资料阅读,也可当作快速阅览机器学习原理基础知识的参考资料. 前言 深度学习是机 ...

  3. 上交张伟楠副教授:基于模型的强化学习算法,基本原理以及前沿进展(附视频)

    2020 北京智源大会 本文属于2020北京智源大会嘉宾演讲的整理报道系列.北京智源大会是北京智源人工智能研究院主办的年度国际性人工智能高端学术交流活动,以国际性.权威性.专业性和前瞻性的" ...

  4. 软件工程学习笔记——软件工程基本原理

    美国著名的软件工程专家B.W.Boehm于1983年提出了软件工程的7条基本原理: 用分阶段的生命周期计划严格管理 这条基本原理意味着:应该把软件生命周期划分成若干个阶段,并相应地制定出切实可行的计划 ...

  5. [学习] FPGA之基本原理(可能理解不对)

    >> 什么是fpga FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL.GAL.EPLD等可编程器件的基础上进一步发展的产物 ...

  6. 深度学习算法原理_用于对象检测的深度学习算法的基本原理

    深度学习算法原理 You just got a new drone and you want it to be super smart! Maybe it should detect whether ...

  7. 在线学习算法FTRL基本原理

    文章目录 相关介绍 SGD: Stochastic Gradient Descent TG 简单加入L1范数 简单截断法 梯度截断法 FOBOS: Forward Backward Splitting ...

  8. 深度学习-CV方向基本原理

    算法 一.卷积 卷积的基本含义 本质上就是相乘求和 功能上拥有数据过滤和增强作用 对于相乘求和,是通用的使用卷积核每个像素点与对应的像素点相乘得到的结果求和作为中心点Result 对于分类:在深度学习 ...

  9. 绝对旋转编码器学习笔记(基本原理,与PC通信等,不定期更新中)

    目录 前言 1.编码器的定义 2.编码器的分类 3.绝对式编码器 3.1工作原理 3.2多圈绝对值编码器 3.3绝对式编码器的特点 3.4绝对式编码器的输出 4.编码器与计算机的通信 4.1绝对值信号 ...

最新文章

  1. 数据库设计的酸(ACID)碱(BASE)原则
  2. Tungsten Fabric SDN — 流量调试手段
  3. 最大信息系数——检测变量之间非线性相关性
  4. android 锁屏音量,Android锁屏状态获取音量按键事件
  5. 杨辉三角python_Python面试150题汇总,都是常问的面试题!
  6. chrome浏览器开发者模式header请求参数“Request Payload“找不到的问题
  7. android handler内存,Android handler之内存泄露原因揭示
  8. 前端工程师技能之photoshop巧用系列第一篇——准备篇
  9. 针对单个网站的渗透思路(精)
  10. 零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷
  11. win7找不到服务器的dns错误怎么办,Win7系统DNS错误怎么办?
  12. 洛谷P1069细胞分裂题解--zhengjun
  13. 186.MultiAutoCompleteTextView
  14. 【应届生必看】技术岗面试应答有哪些话术和技巧?
  15. 从键盘交互式输入-一个人的18位的身份证号,以类似于“2001年09月12日”的形式输出该人的出生日期。
  16. PDF如何删除页面?批量删除不连续页的方法
  17. MD5 SHA1 SHA256 SHA512 SHA1WithRSA RSA 的区别
  18. python新手入门-------字符串与函数(3)
  19. 在线短视频去水印工具网站
  20. IP地址的获取—分析从连接WiFi到上网的全过程(二)

热门文章

  1. 深入Quartz,优雅地管理你的定时任务
  2. Android手机自动发送短信
  3. IBM软件朱近之:云计算中心的实施技术
  4. 数据预处理之标准化(Standardization)、归一化(Normalization)、中心化/零均值化(Zero-centered)
  5. C# Random类
  6. uniapp前端微信h5支付
  7. 音视频知多少(1)声音与视频的基础知识
  8. 自己做的简单网页如何放到服务器上运行
  9. 关于局域网如何组建介绍
  10. 古典音乐常见体裁分类