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

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

实验环境

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

  • 获取内核源码

    wget http://mirrors.aliyun.com/linux-kernel/v4.x/linux-4.2.6.tar.xz # 下载内核源码
    xz –d *.tar.xz # 将源码解压为tar格式
    tar –xvf *.tar # 将源码解压至当前目录

实现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

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

  1. [转帖]linux /proc目录下的文件为何无法用vi编辑保存

    linux /proc目录下的文件为何无法用vi编辑保存 https://blog.51cto.com/xlogin/1216914 学习一下 之前看过书 这一点 没太仔细看.. xlogin关注8人 ...

  2. 9.proc目录下的文件和目录详解

    1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid,而每个进程都有1个目录. /proc/Version:内核版本 /pr ...

  3. 嵌入式 linux下proc目录下的文件详解

    http://blog.csdn.net/skdkjzz/article/details/19566717 目录 ----------------- 0 序言 0.1 简介 0.2 责任 1 收集系统 ...

  4. 为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件

    http://blog.csdn.net/morixinguan/article/details/77808088 上节,我们明白了proc文件系统的作用,接下来我们在友善之臂已经写好的led驱动的基 ...

  5. linux 查看磁盘空间 拷贝不同目录下的文件

    linux 查看磁盘空间 df -h 拷贝不同目录下的文件 cp -rf 目录1 目录2 目录1是需要拷贝的文件所在目录 目录2是需要存放的位置 cp -rf /data/ws/m2e2/ ././表 ...

  6. linux opendir php,php opendir()列出目录下所有文件的实例代码

    这篇文章主要介绍了php opendir()列出目录下所有文件的实例代码的相关资料,需要的朋友可以参考下 php opendir()函数用于打开目录,通常与readdir()和closedir()函数 ...

  7. Linux系统编程:获取指定目录下指定文件类型的数量

    分析 编程实现对指定目录下的指定文件类型数量的统计.这里涉及到对目录文件的打开和对目录文件下的文件的遍历. 这里主要用的2个库函数,打开目录的 opendir函数,readdir函数.对这2个库函数不 ...

  8. Linux cp命令如何拷贝整个目录下所有文件

    复制不包含隐藏文件: cp -R /home/usera/* /mnt/temp 复制包含隐藏文件   : cp -R /home/usera/. /mnt/temp 转载于:https://www. ...

  9. linux目录下所有文件内容替换,linux替换目录下所有文件中的某字符串

    比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做: sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl ...

最新文章

  1. 比特币现金被3.1万多家餐厅接受
  2. 计算机数据链路层教案,第三章 数据链路层(2) 新.ppt
  3. c语言 系统 dome,订餐系统(Dome)
  4. Python_装饰器精讲_33
  5. Ubuntu 16.04安装Markdown编辑器MarkMyWords
  6. 让VS Code总是打开新tab
  7. 决策支持系统4个基本组成部分
  8. oracle数据库max使用,Oracle / PLSQL MAX函数
  9. python panda 库箱线图_Python Pandas 箱线图的实现
  10. Linux 无线网卡驱动安装 Dell Inspiron R14-N4010 笔记本
  11. 什么是索引回表,如何避免(索引覆盖)
  12. android 分享到新浪微博,Android APP集成新浪微博分享功能
  13. 为什么定积分可以求面积?
  14. 【网络与信息安全】 2019年-中国计算机学会推荐国际学术会议和期刊目录(三)
  15. 使用C语言求斐波那契(Fibonacci)数列的第n项
  16. 解决控制面板卸载不了程序的问题
  17. pythonturtle写字_python用turtle写字
  18. 网站服务器选择什么操作系统,网站服务器选择哪种操作系统比较好
  19. python entry高度_Python2.7.3 Tkinter Entry(文本框) 说明
  20. Android灯光系统背光灯

热门文章

  1. 使用Office内置的VBA编辑器实现WORD文档的批量查找替换
  2. Axure RP 如何实现导航栏切换页面——母版
  3. Java代码韦伯分布_韦伯分布的随机数
  4. 基于python的2048游戏设计_Python经典练习,游戏2048实现思路
  5. 小爱音箱怎么装app_小爱音箱app下载-小爱音箱手机版 v2.2.2 - 安下载
  6. 应变/温度数据采集系统设计方案——德维创(DEWETRON)
  7. C语言/C++基础之元旦新年倒计时程序包含天、时、分、秒(附源码)
  8. 离线安装snmp安装包修改snmp、syslog配置文件、创建审计员账号shell脚本(适用于centos 7.x 、redhat 7.x系列)
  9. 红雪iOS6.1.3不完美越狱教程
  10. ubc 文学院 计算机,英属哥伦比亚大学UBC专业