printk会把数据放在内核的1个缓冲区里面,另外一路把信息从硬件上输出出来,当我们想查看之前的信息可以用dmesg命令打印出缓冲区里面的信息。dmesg命令打印出来的信息来自/proc/kmsg

驱动调试之打印到proc虚拟文件1

proc是虚拟的文件系统

系统启动的时候

驱动调试之打印到proc虚拟文件1

里面有mount -a这里a代表把所有的文件系统都挂接上去。

驱动调试之打印到proc虚拟文件1

所有的文件系统在文件fstab中,如把proc文件系统挂载在/proc目录下

驱动调试之打印到proc虚拟文件1

查看挂载的文件系统

驱动调试之打印到proc虚拟文件1

虚拟文件系统proc里面的文件是内核帮我们生成的,属性是读

驱动调试之打印到proc虚拟文件1

可以用 cat /proc/kmsg来查看内核输出信息,每行信息前面都会有打印级别

驱动调试之打印到proc虚拟文件1


再使用cat /proc/kmsg就没有输出信息了,可能是里面读写机制的问题

驱动程序里面都是用printk,假设内核的打印信息非常多,驱动程序把打印信息单独抽出来存在某个地方,不想跟别的东西混杂在一起,可以仿照构造/proc/kmsg文件,驱动程序的信息打印到另外一个buffer里面


printk的信息分两路,一路存在log_buf里面(可以通过 /proc/kmsg读出来,通过dmesg命令读取 /proc/kmsg文件),一路打印出来。仿照:定义1个buf如mulog_buf,生成1个文件/proc/mymsg,读文件/proc/mymsg吧信息打印出来,驱动myprintk把信息存在log_buf

驱动调试之打印到proc虚拟文件1

在内核的fs目录下子目录有proc,里面有proc的各种操作函数

分析proc_misc.c 入口函数

如果配置了CONFIG_PRINTK,create_proc_entry函数创建proc目录里面的1个条目,第1个参数名字是kmsg,第2个参数是属性(只读),第3个参数是parent,表示proc这个根目录里面。创建完后这个条目的file_operation结构体。当应用程序打开/proc/kmsg后,open,read,write时用到结构体proc_kmsg_operation(file_operation)的open,read,write

驱动调试之打印到proc虚拟文件1

搜索别的程序调用create_proc_entry函数,看包含什么文件。

环形缓冲区

buf数组

驱动调试之打印到proc虚拟文件1

printk.c里面

头跟尾一样(读写位置)为空时休眠,当里面有数据时,头尾不相等就会唤醒

驱动调试之打印到proc虚拟文件1

唤醒后从环形缓冲区读取数据,然后通过调用_put_user返回给用户

驱动调试之打印到proc虚拟文件1







相关文章:

  • 2021-11-26
  • 2021-07-02
  • 2021-12-02
  • 2022-02-28
  • 2021-08-29
  • 2022-01-03
  • 2022-01-04
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-29
  • 2022-12-23
  • 2021-11-27
  • 2021-09-23
  • 2021-11-18
相关资源
相似解决方案