首页 > 系统相关 >Linux设备文件三大结构:inode,file,file_operations

Linux设备文件三大结构:inode,file,file_operations

时间:2023-03-31 22:44:36浏览次数:32  
标签:operations 文件 struct open mode file Linux inode

struct inode

Linux中一切皆文件,当我们在Linux中创建一个文件时,就会在相应的文件系统创建一个inode与之对应,文件实体和文件的inode是一一对应的,创建好一个inode会存在存储器中,第一次open就会将inode在内存中有一个备份,同一个文件被多次打开并不会产生多个inode,当所有被打开的文件都被close之后,inode在内存中的实例才会被释放。既然如此,当我们使用mknod(或其他方法)创建一个设备文件时,也会在文件系统中创建一个inode,这个inode和其他的inode一样,用来存储关于这个文件的静态信息(不变的信息),包括这个设备文件对应的设备号,文件的路径以及对应的驱动对象etc。inode作为VFS四大对象之一,在驱动开发中很少需要自己进行填充,更多的是在open()方法中进行查看并根据需要填充我们的file结构。
对于不同的文件类型,inode被填充的成员内容也会有所不同,以创建字符设备为例,我们知道,cdev_add其实是把一个字符驱动对象和一个(一组)设备号联系到一起。而创建设备文件,其实是把设备文件设备号联系到一起。至此,这三者就被绑定在一起了。这样,内核就有能力创建一个struct inode实例了。

struct inode {
    umode_t            i_mode;
    unsigned short        i_opflags;
    kuid_t            i_uid;
    kgid_t            i_gid;
    unsigned int        i_flags;

...
    union {
        const struct file_operations    *i_fop;    /* former ->i_op->default_file_ops */
        void (*free_inode)(struct inode *);
    };
    struct file_lock_context    *i_flctx;
    struct address_space    i_data;
    struct list_head    i_devices;
    union {
        struct pipe_inode_info    *i_pipe;
        struct cdev        *i_cdev;
        char            *i_link;
        unsigned        i_dir_seq;
    };

...

    void            *i_private; /* fs or device private pointer */
}

特殊文件类型的union:pipe、cdev、link、dir_seq,i_cdev表示这个inode属于一个字符设备文件,创建字符设备文件的时候会把与之相关的设备号的驱动对象cdev拿来填充

i_fop:创建设备文件的时候,i_fop 填充的是def_chr_fops、def_blk_fops、pipefifo_fops之一,参见创建过程中调用的init_special_inode()

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{
    inode->i_mode = mode;
    if (S_ISCHR(mode)) {
        inode->i_fop = &def_chr_fops;
        inode->i_rdev = rdev;
    } else if (S_ISBLK(mode)) {
        inode->i_fop = &def_blk_fops;
        inode->i_rdev = rdev;
    } else if (S_ISFIFO(mode))
        inode->i_fop = &pipefifo_fops;
    else if (S_ISSOCK(mode))
        ;    /* leave it no_open_fops */
    else
        printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for"
                  " inode %s:%lu\n", mode, inode->i_sb->s_id,
                  inode->i_ino);
}
const struct file_operations def_chr_fops = {
    .open = chrdev_open,
    .llseek = noop_llseek,
};

struct file

每一个进程维护一个打开文件描述符表。open()的过程其实就是根据传入的路径创建一个 file 并将其赋值到数组中,并返回其索引。

struct file {
...
    struct path        f_path;
    struct inode        *f_inode;    /* cached value */
    const struct file_operations    *f_op;

    /*
     * Protects f_ep, f_flags.
     * Must not be taken from IRQ context.
     */
    spinlock_t        f_lock;
    enum rw_hint        f_write_hint;
    atomic_long_t        f_count;
    unsigned int         f_flags;
    fmode_t            f_mode;
    struct mutex        f_pos_lock;
    loff_t            f_pos;
    struct fown_struct    f_owner;
    const struct cred    *f_cred;
    struct file_ra_state    f_ra;

    u64            f_version;
#ifdef CONFIG_SECURITY
    void            *f_security;
#endif
    /* needed for tty driver, and maybe others */
    void            *private_data;

...
}

 

f_path:存储的是open传入的路径,VFS就是根据这个路径逐层找到相应的inode

f_inode:存储的是找到的inode

f_op:存储的就是驱动提供的file_operations对象,这个对象应该在第一次open()的时候被填充,具体地,应用层的open通过层层搜索会调用inode.i_fops->open(),对于字符设备文件即chrdev_open()

 

标签:operations,文件,struct,open,mode,file,Linux,inode
From: https://www.cnblogs.com/god-of-death/p/17277683.html

相关文章

  • Redhat/CentOS Linux 系统进入单用户模式
    Redhat/CentOSLinux系统进入单用户模式以CentOS7.9和Redhat8.2为例进行操作,因为CentOS是Redhat的发行版,所以同版本号界面和操作是一样的。CentOS7.9 开机在grub引导界面时,按下e键进入编辑模式: 找到linux16这一行,在行末添加rd.break(注意这里是一整行),使用Ct......
  • RockyLinux9配置网络
    编辑配置文件vim/etc/sysconfig/network-scripts/ifcfg-enp0s3TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=noNAME=enp0s3DEVICE=enp0s3ONBOOT=yesIPADDR=192.168.1.110PREFIX=24GATEWAY=192.168.1.1D......
  • 四个常见的Linux面试问题
    刚毕业要找工作了,只要是你找工作就会有面试这个环节,那么在面试环节中,有哪些注意事项值得我的关注呢?特别是专业技术岗位,这样的岗位询问一般都是在职的工程师,如何在面试环节更好地理解面试官的问题,我们一起往下看吧。在学校学习也好,在培训机构或者网络在线学习也好,无论是通过那种途......
  • 【webserver 前置知识 02】Linux网络编程入门其一
    网络结构模式C/S结构服务器-客户机,即Client-Server(C/S)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。在C/S结构中,应用程序分为两部分:服务器部分和客户......
  • 用飞书账号登录web应用、Linux服务器
    某初创型的科技公司拥有5、6个web应用,采用飞书作为移动办公沟通协作工具。为提高办公效率及运维效率,公司想用飞书账号作为身份源,登录web应用及Linux服务器。视该公司部署方式而定(本地化部署还是采用SaaS服务),宁盾有对应的产品及解决方案:宁盾目录服务或云身份目录平台。解决思路是:将......
  • linux下的vim使用教程!从零基础到入门!
    linux下的vim使用教程!从零基础到入门!vim的介绍!Vim是一个类似于vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性vim是一种多模式的编译器!也是在linux下进行编程的一种常用的编辑器!因为其很高的上手难度,也往往让很多新人看了望而却步!今天我将详细的......
  • linux ftp服务器报错:425 Data Connection Failed.的解决方法
    原先我写的脚本:然后会出现450错误  修改后的脚本: 再操作前,增加passive一条语句就解决了。参考博客:https://www.codenong.com/cs106853176/    ......
  • 关于linux环境下配置c/c++程序的编译器
    第一步:切换root用户     命令为:suroot然后输入密码即可第二步:输入命令  yum installgcc 和 yuminstall g++  第三步:通过查找路径来检查是否安装成功  whichgcc和 whichg++......
  • linux日志总结
    0x00前言Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。本文简介一下Linux系统日志及日志分析技巧。0x01日志简介1.1日志服务syslogd介绍说到Linux的日志,就不得不提到syslogd。它是大部分Linux发行版默认的......
  • linux常用命令总结
    1、文本类catcat-ntextfile1>textfile2#把textfile1的文档内容加上行号后输入textfile2这个文档里cat-btextfile1textfile2>>textfile3#把textfile1和textfile2的文档内容加上行号(空白行不加)之后将内容附加到textfile3文档里cat/dev/null>/etc/te......