ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 操作系统 >> Linuxjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播 >> 定性分析与定量分析 35Linux-分析并制作环形缓冲区

定性分析与定量分析 35Linux-分析并制作环形缓冲区(1/5)

来源:网络整理     时间:2017-12-07     关键词:定性分析与定量分析

本篇文章主要介绍了"定性分析与定量分析 35Linux-分析并制作环形缓冲区",主要涉及到定性分析与定量分析方面的内容,对于Linuxjrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 在上章34.Linux-printk分析、使用printk调试驱动里讲述了: printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可...

在上章34.Linux-printk分析、使用printk调试驱动里讲述了:

     printk()会将打印信息存在内核的环形缓冲区log_buf[]里, 可以通过dmesg命令来查看log_buf[]

 


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之后的新的信息,比如下图所示:

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

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

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

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

conststruct 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)可读,其他任何人不能进行任何操作,如下图所示:

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

该参数和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()看看,就知道了

static ssize_t kmsg_read(struct file *file, char __user *buf,size_t count, loff_t *ppos)
{
       /*若在非阻塞访问,且没有读的数据,则立刻return*/if ((file->f_flags & O_NONBLOCK) && !do_syslog(9, NULL, 0))
              return -EAGAIN;
       return do_syslog(2, buf, count);          //开始读数据,buf:用户层地址,count:要读的数据长度}

定性分析与定量分析相关图片

定性分析与定量分析相关文章