35.Linux-分析并制作环形缓冲区

1.环形缓冲区log_buf[]又是存在内核的哪个文件呢?

位于/proc/kmsg里,所以除了dmesg命令查看,也可以使用cat /proc/kmsg来查看

 

2.但是,dmesg命令和cat /proc/kmsg有所不同

2.1 dmesg命令

每次使用,都会打印出环形缓冲区的所有信息

2.2 cat /proc/kmsg

只会打印出每次新的环形缓冲区的信息

比如,第一次使用cat /proc/kmsg,会打印出内核启动的所有信息

第二次使用cat /proc/kmsg,就不会出现之前打印的信息,只打印继上次使用cat /proc/kmsg之后的新的信息,比如下图所示:

 

 

3.接下来我们便进入内核,找/proc/kmsg文件在哪生成的

搜索"kmsg",找到位于fs\proc\proc_misc.c 文件的proc_misc_init()函数中,

该函数主要用来生成登记的设备文件,具体代码如下所示:

复制代码
const struct file_operations proc_kmsg_operations = {
       .read              = kmsg_read,               //读函数
       .poll        = kmsg_poll,
       .open             = kmsg_open,
       .release   = kmsg_release,
};
 

void __init proc_misc_init(void)
{
  ... ...
  struct proc_dir_entry *entry;                                   // 用来描述文件的结构体,
         entry = create_proc_entry("kmsg", S_IRUSR, &proc_root); //使用create_proc_entry()创建文件
if (entry)
         entry->proc_fops = &proc_kmsg_operations;    //对创建的文件赋入file_ operations
    ... ...
}
复制代码

从上面代码得出,/proc/kmsg文件,也是有file_operations结构体的,而cat命令就会一直读/proc/kmsg的file_operations->read(),实现读log_buf[]的数据

且/proc/kmsg文件是通过create_proc_entry()创建出来的,参数如下所示:

"kmsg":文件名

&proc_root:父目录,表示存在/proc根目录下

S_IRUSR: 等于400,表示拥有者(usr)可读,其他任何人不能进行任何操作,如下图所示:

 

该参数和chmod命令参数一样,除了S_IRUSR还有很多参数,比如:

S_IRWXU: 等于700, 表示拥有者(usr)可读(r)可写(w)可执行(x)

S_IRWXG: 等于070, 表示拥有者和组用户 (group)可读(r)可写(w)可执行(x)

 

4.为什么使用dmesg命令和cat /proc/kmsg会有这么大的区别?

我们进入proc_kmsg_operations-> kmsg_read()看看,就知道了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值