zoukankan      html  css  js  c++  java
  • file_operations -- file -- inode

    http://blog.chinaunix.net/space.php?uid=11412571&do=blog&cuid=343846

    驱动中有几个重要的数据结构:
            file_operations,file,inode
    中定义了这三个结构.
    struct file_operations {
            struct module *owner;
            loff_t (*llseek) (struct file *, loff_t, int);
            ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
            ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
            ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
            ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
            int (*readdir) (struct file *, void *, filldir_t);
            unsigned int (*poll) (struct file *, struct poll_table_struct *);
            int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
            int (*mmap) (struct file *, struct vm_area_struct *);
            int (*open) (struct inode *, struct file *);
            int (*flush) (struct file *);
            int (*release) (struct inode *, struct file *);
            int (*fsync) (struct file *, struct dentry *, int datasync);
            int (*aio_fsync) (struct kiocb *, int datasync);
            int (*fasync) (int, struct file *, int);
            int (*lock) (struct file *, int, struct file_lock *);
            ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
            ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
            ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);
            ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
            unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
            int (*check_flags)(int);
            int (*dir_notify)(struct file *filp, unsigned long arg);
    }
       file_operations结构定义了一组函数指针,每一个打开的文件(用struct file表示)和他自己的一组函数(包含在一个叫f_op的域中,它指向一个struct file_operations结构)相联系.这些操作都是来实现系统调用的,所以才被命名为open,read,等等.对于那些不需要的功能(比如你的 设备不需要write功能,即不需要向设备写数据),可以给write指针付NULL.
     
    struct file {
            struct list_head        f_list;
            struct dentry           *f_dentry;
            struct vfsmount         *f_vfsmnt;
            struct file_operations  *f_op;
            atomic_t                f_count;
            unsigned int            f_flags;
            mode_t                  f_mode;
            int                     f_error;
            loff_t                  f_pos;
            struct fown_struct      f_owner;
            unsigned int            f_uid, f_gid;
            struct file_ra_state    f_ra;
     
            unsigned long           f_version;
            void                    *f_security;
     
            /* needed for tty driver, and maybe others */
            void                    *private_data;
     
    #ifdef CONFIG_EPOLL
            /* Used by fs/eventpoll.c to link all the hooks to this file */
            struct list_head        f_ep_links;
            spinlock_t              f_ep_lock;
    #endif /* #ifdef CONFIG_EPOLL */
            struct address_space    *f_mapping;
    };
       每个打开的文件对应一个struct file.它在被打开时由内核创建,并传给它所有可以操作该文件的函数,到文件被关闭时才被删除.
     
    The inode Structure.
       Inode结构是用来在内核内部表示文件的.同一个文件可以被打开好多次,所以可以对应很多struct file,但是只对应一个struct inode.该结构里面包含了很多信息,但是,驱动开发者只关心里面两个重要的域:
            dev_t i_rdev;//含有真正的设备号
            struct cdev *i_cdev;//struct cdev是内核内部表示字符设备的结构.
       struct file_operations是struct file的一个域,我们在使用系统调用open()打开一个设备节点struct inode时,我们会得到一个文件struct file,同时返回一个文件描述符,该文件描述符是一个整数,我们称之为句柄,通过访问句柄我们能够访问设备文件struct file,描述符是一个有着特殊含义的整数,特定位都有一定的意义或属性。
    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(566) | 评论(0) | 转发(0) |
    0

    上一篇:Linux 系统调用

    下一篇:Linux I2C驱动分析

    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    (七)mysql 记录长度
    (六)列类型
    (五)校对集
    (四)中文数据问题
    Spring Boot Jpa 的使用
    Spring Boot:如何优雅的使用 Mybatis
    Spring Boot:定时任务
    Spring Boot 小技巧
    【重磅】Spring Boot 2.0权威发布
    Spring Boot + Jpa + Thymeleaf 增删改查示例
  • 原文地址:https://www.cnblogs.com/ztguang/p/12647423.html
Copyright © 2011-2022 走看看