• 内核printk原理介绍 - 知乎 (zhihu.com)

  • 34.Linux-printk分析、使用prink调试驱动 (bbsmax.com)

  • 【原创】计算机自制操作系统(Linux篇)五:内核开发之万丈高楼从地起---printk(理清pintf/vprintf;sprintf/vsprintf ;fprintf/vfprintf) - 知乎 (zhihu.com)

  • printk流程分析 - 知乎 (zhihu.com)

  • va_list、va_start和va_end使用 - insistYuan - 博客园 (cnblogs.com)

  • asmlinkage-SodaGreen_wyj-ChinaUnix博客

  • (34条消息) kernel里__printf(a, b)说明_茫茫大士的博客-CSDN博客_kernel __printf(2, 3)

  • Printk Index — The Linux Kernel documentation

  • (34条消息) 宋宝华:为了不忘却的纪念,评Linux 5.13内核_宋宝华的博客-CSDN博客

  • (34条消息) linux5.2内核的ringbuffer(无锁环形缓冲区)原理实现与源码分析(上)_你听不到的博客-CSDN博客_linux内核ringbuf实现

  • Lockless Ring Buffer Design — The Linux Kernel documentation

基于linux 6.1.12

  1. files

  • /kernel/printk/printk.c

  • /include/linux/printk.h

  • /kernel/printk/printk_ringbuffer.c

  • /kernel/printk/printk_ringbuffer.h

  1. data structure

3. overall call flow

3.1 write flow

(1)desc_reserve:从prb_desc数组中获取一个空闲的entry,若没有空闲的entry,则覆盖最老的entry。分配完成后将该描述符状态设置为desc_reserved

(2)设置该条log的seq序号

(3)data_alloc:从ring buffer中分配一段用于保存新log的空间,若空闲空间不足,则覆盖掉最老的数据,直到空间足够为止

(4)log data copy:将需要写入的数据拷贝到从log buffer中分配的空间中

(5)_prb_commit:将prb_desc的状态更新为desc_committed

(6)desc_make_final:将prb_desc的状态更新为desc_finalized,该操作后log写入完成且可被读取。

3.2 read flow

读取log时以seq序号为参数,并调用prb_read读取该seq对应的log,若读取失败则调用prb_first_seq获取该seq之后第一条可读的log,并重新读取。

(1)desc_read_finalized_seq:读取该条log对应的状态,若状态合法,则执行下面的log数据和信息读取操作,否则表明该条log已被覆盖、正在被修改或其描述符是空闲的。数据读取完成后,再次执行本函数重新读取其状态和seq号,若状态合法且seq号未变,表明在读的过程中,数据未被写操作修改。否则,表明在读的过程中,该条log的信息或数据已被log写接口覆盖修改了。若整个读流程成功,则数据读取完成,否则调用prb_first_seq获取下一条可读的log

(2)prb_first_seq:由于buffer中尾节点是最老的log数据,因此若待读取数据比尾结点数据还老,则表明该数据已被覆盖,将尾结点作为first seq读取即可。若该节点合法,但数据读取失败,则将下一个节点作为first seq读取。若缓冲区中无有效数据,则返回错误

4. 设计思想

  1. 如何通过细化数据,分而治之,通过添加 prb_desc_ring,以及采用 atomic_t 变量等方法来去除锁的消耗。

printk内核实现原理相关推荐

  1. Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF

    可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...

  2. 内核虚拟机原理|网络可编程

    自 3.15 以来,您可能一直在关注内核社区中扩展的 Berkeley 包过滤器 (eBPF) 的开发,或者您可能仍然将 Berkeley 包过滤器与 Van Jacobson 在 1992 年所做的 ...

  3. Linux内核vmalloc原理与实现

    <vmalloc原理与实现> <Linux内核空间内存申请函数kmalloc.kzalloc.vmalloc的区别> <内核中的内存申请:kmalloc.vmalloc. ...

  4. IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念

    IO操作底层调用过程|内核|中断| 做后端的程序员都知道我们编写的程序主要分方法程序和IO操作程序. 有什么不一样呢? 方法程序就不多说了.IO程序有什么不同呢?IO操作指的是对硬件设备操作,比如键盘 ...

  5. Linux高级应用(九)Linux内核的原理和配置

    一.嵌入式Linux平台的启动过程 1.运行启动引导程序-bootloader(相当于PC的BIOS) Booting from NAND Load Kernel- Uncompressing Lin ...

  6. printk 内核打印

    printk 在内核源码中用来记录日志信息的函数,只能在内核源码范围内使用,用法类似于 printf 函数. printk 函数主要做两件事情: 将信息记录到 log 中: 调用控制台驱动来将信息输出 ...

  7. Linux内核锁实现原理,linux 大内核锁原理

    大内核锁(BKL)的设计是在kernel hacker们对多处理器的同步还没有十足把握时,引入的大粒度锁. 他的设计思想是,一旦某个内核路径获取了这把锁,那么其他所有的内核路径都不能再获取到这把锁. ...

  8. netlink的内核实现原理

    注:      当用户态进程发送数据时,调用sendmsg实现,其调用内核netlink_sendmsg函数完成,新建了sk_buff,然后给其cb私有缓存中保存了源地址信息,然后把数据拷贝到sk_b ...

  9. Windows内核与原理读书笔记之DPC和时钟中断和定时器管理

    1.DPC(延迟过程调用) DPC有普通的(normal) 和线程的(threaded).普通的DPC可以在任何一个线程环境中运行,线程的DPC只能在一个专门的DPC线程中运行. WRK 中DPC对象 ...

最新文章

  1. 【工具】ApkTools
  2. OBjective-C:文件管理类NSFileManager
  3. 【Android 应用开发】Android中使用ViewPager制作广告栏效果 - 解决ViewPager占满全屏页面适配问题
  4. 多线程的三种实现方法
  5. Istio 庖丁解牛六:多集群网格应用场景
  6. ndarray的转置(numpy.transpose()与A.T命令对比详解)
  7. 在windows上搭建redis集群(Redis-Cluster)
  8. Python-斗地主原来是这样的引擎!会了Python之后,我就没输过豆子了!
  9. 95-40-025-java.util.concurrent-并发容器
  10. 如何建立数据平台?看上市公司的选择!
  11. 负载均衡轮询算法和服务器性能,负载均衡算法
  12. 如果面试官问您还有什么问题要问的,应该如何巧妙的回答才算合适呢?
  13. matlab与无网格,无网格法
  14. R语言数据缺失值处理
  15. CentOS 7超详细安装与网络配置
  16. SOX命令:音频位深度、采样率以及码率
  17. Qt编写安防视频监控系统68-兼容Qt4到Qt6
  18. cos和sin的使用
  19. pdcch加扰_一种基站/终端及其PDCCH加扰/解扰的方法和装置_2014104470078_权利要求书_专利查询_专利网_钻瓜专利网...
  20. 如何禁止计算机被网络访问,局域网内如何禁止别人访问自己的电脑

热门文章

  1. 基于simulink的无刷直流电动机性能仿真
  2. Avaya CEO:愿意与思科、微软共享客户
  3. DTOJ#4170. 「PKUWC2018」猎人杀
  4. 最近日益火热的三农金融话题能为理财的首选吗
  5. debian 11 安装bind9服务
  6. 六大设计原则 (SOLID)
  7. 2023校招美团第三次笔试
  8. 美国国防部可信计算机系统评估系TCSEC
  9. 针对大学城的二手书市场
  10. guice使用方法(1)