Linux编写内核模块,实现在/proc目录下添加文件

/proc是Linux上的一种虚拟文件系统,存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以更改其中某些文件来改变内核的运行状态。

现编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world。

实验环境

Ubuntu 18.04.1,源码内核版本:Linux-4.2.6

实现proc系统的代码主要在linux/fs/proc目录下。该目录下的文件如下图所示。
在这里插入图片描述

创建目录

在Linux内核网址https://www.kernel.org/doc/html/latest/查阅相关文档可知,proc中创建目录的函数为proc_mkdir,该函数原型为:

struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);

该函数接受两个参数,分别为要创建的目录的名称以及一个指向该目录的父目录的指针,并返回指向当前目录的指针结构体。

创建文件

考虑到在/proc目录下有version和softirqs等文件,且源码中有以上文件的实现,分别为version.c和softirqs.c,则可参考这两个文件的实现进一步实现创建world文件。以version.c为例,部分代码如下图所示。
在这里插入图片描述
显然,创建version文件的函数为proc_create,查阅文档可知,该函数原型为:

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

该函数接收4个参数,第一个参数为文件名,第二个参数为文件的读写权限,第三个参数为其父目录的结构体指针,第四个参数为文件的读写操作结构体。

参照/proc/version文件的实现代码和本实验要求,可写出创建world文件的主要代码:
在这里插入图片描述
其中,world文件的父目录指针即为先前创建hello目录所返回的指针,proc_fops定义了该文件所能执行的操作,由于本实验只要求读取文件内容,因此只实现了read属性:
在这里插入图片描述
其中,read_proc为实现读取文件内容的函数指针,其实现如下:
在这里插入图片描述
该函数将文件内容通过msg复制给buf,以此实现文件内容的读取。
最后,再分别定义该模块的初始化和清理函数,其实现如下:
在这里插入图片描述

编写Makefile

为编译该模块,还需编写Makefile文件,该文件内容如图所示:
在这里插入图片描述

结果

结果如图所示。由图可见,/proc目录下生成了hello目录,且该目录下的world文件的内容为hello world。
在这里插入图片描述

运行与验证

尽管本实验的内核版本为Linux-4.2.6,但是经测试可知,该模块在3.10及以上版本均可使用。
为使用该模块,首先需要下载3.10及以上Linux内核版本并解压,然后将proc_hello.c文件拷贝至Linux/fs/proc目录下,由于该目录下原本就有Makefile文件,因此要对原Makefile文件备份后再拷贝本实验中的Makefile:

mv Makefile Makefile.bak
mv my_makefile Makefile

然后,再使用make命令编译模块:
在这里插入图片描述
编译成功后,再使用insmod命令安装模块,可以看到该目录下多了一个ko文件,该文件即为编译成功的模块文件。
在这里插入图片描述
最后切换至/proc目录,即可看到上述结果。

完整实现代码已上传至我的github

参考资料

[1] Robert Love, Robert Love. Linux内核设计与实现(原书第3版)[M].陈莉君,译.机械工业出版社,2011
[2] Daniel P. Bovet, Marco Cesati. 深入理解LINUX内核(第三版)[M].陈莉君,张琼声,张宏伟,译.中国电力出版社,2007
[3] https://www.jianshu.com/p/a6c33bf39067 编译安装 Linux 内核并添加系统调用
[4] https://tuxthink.blogspot.com/2013/10/creating-read-only-proc-entry-in-kernel.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章