Linux内核模块编程-proc文件系统进阶

本文探讨如何在Linux内核模块中利用proc文件系统进行数据的读写交互。介绍了proc_dir_entry结构的变化,特别是从2.6内核到3.10内核的差异,强调在3.10内核中应使用VFS接口来操作proc。通过一个示例详细讲解了模块初始化、注销、VFS接口注册、open/close、read/write的实现以及权限检测,并给出了测试方法。
摘要由CSDN通过智能技术生成

proc作为输入

关于proc的一些基本概念和基本使用以及一些核心数据结构可以参考我的上一篇文章
在上一篇文章中提到了利用proc作为内核空间传递数据给用户空间的一种方式,那么proc能否作为用户空间传递数据给内核空间的一种手法呢?答案当然是可以的,熟悉linux的读者应该都知道我们不光光可以读取proc文件中的内容还是可以向proc文件中写入要传递的数据的,那么如何通过proc来向内核输入信息呢,通过查看proc_dir_entry发现,在这个proc核心数据结构中不仅仅有一个read_proc的函数指针,而且还有一个write_proc函数指针。恭喜你猜对了,通过这个钩子函数的确就可以实现利用proc向内核空间传递数据,但是随着内核的发展,内核的开发者采用了另外一种方式来提供proc的读写钩子函数。在2,6内核中两种方式都是可以的,后来笔者发现在我使用的3.10内核上居然已经没有第一种了。

2.6系列的内核提供了两种方法来操作proc
一种就是:

    read_proc_t *read_proc;
    write_proc_t *write_proc;

第二种就是:

    struct inode_operations * proc_iops;
    const struct file_operations * proc_fops;
    可以参考linux内核文件系统相关的知识

可是到了3.10系列内核后就只有第二种了,所以为了兼容不同内核版本,在操作proc的时候最好按照标准的VFS的接口形式来操作VFS两种不同版本内核对proc_dir_entry的定义
下面是在2.6内核以及3.10内核中关于proc_dir_entry这个核心数据结构的定义的区别。

struct proc_dir_entry {
    unsigned int low_ino;
    unsigned short namelen;
    const char *name;
    mode_t mode;
    nlink_t nlink;
    uid_t uid;
    gid_t gid;
    loff_t size;
    struct inode_operations * proc_iops;
    const struct file_operations * proc_fops;
    get_info_t *get_info;
    struct module *owner;
    struct proc_dir_entry *next, *parent, *subdir;
    void *data;
    read_proc_t *read_proc;
    write_proc_t *write_proc;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值