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

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


proc是虚拟的文件系统

系统启动的时候


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


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


查看挂载的文件系统


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


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



再使用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


在内核的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


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

环形缓冲区

buf数组


printk.c里面

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


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








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值