树莓派的内核模块编程之proc文件系统

树莓派的内核模块编程之proc文件系统

引言

在linux系统中,/proc目录下的文件提供了linux系统在运行过程中的相关信息,但/proc是虚拟文件系统,只存储在内存中。/proc文件系统也是实现内核空间与用户空间通信的重要方式,因此本文对/proc文件系统进行讲解。

一、proc文件系统介绍

proc文件和我们熟悉的文档文件不同,我们通常所用的文档文件存储在外存中,也就是硬盘或者优盘中,其中所存储的数据不会随着断电而丢失;而proc文件存储在内存中,其中所存储的数据断电后即会被删除。用户可以通过proc文件得到与系统相关的信息以及正在运行的进程信息。下图是/proc目录下的文件内容:

树莓派的内核模块编程之proc文件系统

从上图我们可以看到,/proc目录下有两种文件名,一种是以数字命名的文件,还有一种是以字母命名的文件。以数字命名的文件存储了对应进程号的信息,字母命名的文件存储了系统相关信息。例如,/proc/sys/kernel/hostname存储了主机名称,我们可以使用cat命令访问,使用方法如下:

树莓派的内核模块编程之proc文件系统

二、proc文件系统模块编程

proc文件系统的编程与字符设备编程类似,首先都要创建一个proc文件,随后通过定义file_operations结构体定义文件操作函数,最后定义proc文件移除操作。

在之前内核版本中可以使用create_proc_entry()函数,但在当前内核版本中,创建一个proc文件只能使用proc_create()函数。proc_create()函数原型如下:

static inline structproc_dir_entry *proc_create( const char *name, umode_t mode, structproc_dir_entry *parent, const struct file_operations *proc_fops)

上述函数中,name参数就是要创建的proc文件名;mode参数表示proc文件的访问权限,采用UGO的方式表示;parent参数所要建立的proc文件的父文件夹,通常该参数设置为NULL;proc_fops参数是文件的操作函数。

如果要清除所创建的proc文件,则需要使用remove_proc_entry()函数。remove_proc_entry()函数原型如下:

void remove_proc_entry(const char*name, struct proc_dir_entry *parent)

name参数和parent参数均与proc_create()一样。

为了让我们创建的proc文件具有读写功能,我们需要通过file_operations结构体来为proc文件定义读写函数,这里与字符设备驱动编程相同,具体内容可以参考之前发布的文章《树莓派的内核模块编程之字符设备驱动器》。

三、程序示例

本文所使用的代码可通过如下链接下载:

链接:https://pan.baidu.com/s/12bTIwh-dJ08YPdp2xx7UFg

提取码:6q8p

树莓派的内核模块编程之proc文件系统

如上图所示,将下载的代码保存在一个文件夹内。

随后进入该文件夹,执行以下命令来编译与安装内核模块:

树莓派的内核模块编程之proc文件系统

随后查看/proc目录,我们会发现该目录下多了个PROCTEST文件,这就是我们通过代码生成的proc文件,如下图所示:

树莓派的内核模块编程之proc文件系统

随后我们需要修改PROCTEST文件的权限,并对其做读写操作,命令如下图所示:

树莓派的内核模块编程之proc文件系统

最后我们需要卸载该模块,命令如下:

树莓派的内核模块编程之proc文件系统


分享到:


相關文章: