文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

linux有没有内核文件操作函数

2023-03-02 20:20

关注

这篇文章主要介绍“linux有没有内核文件操作函数”,在日常操作中,相信很多人在linux有没有内核文件操作函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”linux有没有内核文件操作函数”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

linux有内核文件操作函数,例filp_open()函数可用于打开文件、vfs_read()函数可用于读取文件、vfs_write()函数可用于写文件、filp_close()函数可用于关闭文件。在vfs_read和vfs_write函数中,其第二个参数指向的用户空间的内存地址,如果直接使用内核空间的指针,则会返回“-EFALUT”。

1. 内核空间文件操作

功能函数原型
打开文件struct file *filp_open(const char *filename, int flags, int mode)
读文件ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
写文件ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
关闭文件int filp_close(struct file *filp, fl_owner_t id)

2. 内核空间与用户空间

在vfs_read和vfs_write函数中,其参数buf指向的用户空间的内存地址,如果我们直接使用内核空间的指针,则会返回-EFALUT。这是因为使用的缓冲区超过了用户空间的地址范围。一般系统调用会要求你使用的缓冲区不能在内核区。这个可以用set_fs()、get_fs()来解决。

include/asm/uaccess.h中,有如下定义:

#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })

#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFF)

#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)

#define get_ds() (KERNEL_DS)

#define get_fs() (current->addr_limit)

#define set_fs(x) (current->addr_limit = (x))

如果使用,如下:

mm_segment_t fs = get_fs();

set_fs(KERNEL_FS);

//vfs_write();

vfs_read();

set_fs(fs);

详尽解释:系统调用本来是提供给用户空间的程序访问的,所以,对传递给它的参数(比如上面的buf),它默认会认为来自用户空间,在read或write()函数中,为了保护内核空间,一般会用get_fs()得到的值来和USER_DS进行比较,从而防止用户空间程序“蓄意”破坏内核空间;而现在要在内核空间使用系统调用,此时传递给read或write()的参数地址就是内核空间的地址了,在USER_DS之上(USER_DS ~ KERNEL_DS),如果不做任何其它处理,在write()函数中,会认为该地址超过了USER_DS范围,所以会认为是用户空间的“蓄意破坏”,从而不允许进一步的执行;为了解决这个问题set_fs(KERNEL_DS)将其能访问的空间限制扩大到KERNEL_DS,这样就可以在内核顺利使用系统调用了!

3.Linux struct inode结构


struct inode {
        struct hlist_node       i_hash;              
        struct list_head        i_list;              
        struct list_head        i_dentry;            
        unsigned long           i_ino;               
        atomic_t                i_count;             
        umode_t                 i_mode;              
        unsigned int            i_nlink;             
        uid_t                   i_uid;               
        gid_t                   i_gid;               
        kdev_t                  i_rdev;              
        loff_t                  i_size;              
        struct timespec         i_atime;             
        struct timespec         i_mtime;             
        struct timespec         i_ctime;             
        unsigned int            i_blkbits;           
        unsigned long           i_blksize;           
        unsigned long           i_version;           
        unsigned long           i_blocks;            
        unsigned short          i_bytes;             
        spinlock_t              i_lock;              
        struct rw_semaphore     i_alloc_sem;         
        struct inode_operations *i_op;               
        struct file_operations  *i_fop;              
        struct super_block      *i_sb;               
        struct file_lock        *i_flock;            
        struct address_space    *i_mapping;          
        struct address_space    i_data;              
        struct dquot            *i_dquot[MAXQUOTAS]; 
        struct list_head        i_devices;           
        struct pipe_inode_info  *i_pipe;             
        struct block_device     *i_bdev;             
        unsigned long           i_dnotify_mask;      
        struct dnotify_struct   *i_dnotify;          
        unsigned long           i_state;             
        unsigned long           dirtied_when;        
        unsigned int            i_flags;             
        unsigned char           i_sock;              
        atomic_t                i_writecount;        
        void                    *i_security;         
        __u32                   i_generation;        
        union {
                void            *generic_ip;         
        } u;
};


struct inode_operations {
        int (*create) (struct inode *, struct dentry *,int);
        
        struct dentry * (*lookup) (struct inode *, struct dentry *);
        
        int (*link) (struct dentry *, struct inode *, struct dentry *);
        
        int (*unlink) (struct inode *, struct dentry *);
        
        int (*symlink) (struct inode *, struct dentry *, const char *);
        
        int (*mkdir) (struct inode *, struct dentry *, int);
        
        int (*rmdir) (struct inode *, struct dentry *);
        
        int (*mknod) (struct inode *, struct dentry *, int, dev_t);
        
        int (*rename) (struct inode *, struct dentry *,
                       struct inode *, struct dentry *);
        
        int (*readlink) (struct dentry *, char *, int);
        
        int (*follow_link) (struct dentry *, struct nameidata *);
        
        int (*put_link) (struct dentry *, struct nameidata *);
        
        void (*truncate) (struct inode *);
        
        int (*permission) (struct inode *, int);
        
        int (*setattr) (struct dentry *, struct iattr *);
        
        int (*getattr) (struct vfsmount *, struct dentry *, struct kstat *);
        
        int (*setxattr) (struct dentry *, const char *,
                         const void *, size_t, int);
        
        ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
        
        ssize_t (*listxattr) (struct dentry *, char *, size_t);
        
        int (*removexattr) (struct dentry *, const char *);
        
};

4.Linux struct file结构
struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中,其原型是:

struct file {
        
        union {
                struct list_head        fu_list;
                struct rcu_head         fu_rcuhead;
        } f_u;
        struct path             f_path;
#define f_dentry        f_path.dentry
#define f_vfsmnt        f_path.mnt
        const struct file_operations    *f_op;
        atomic_t                f_count;
        unsigned int            f_flags;
        mode_t                  f_mode;
        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;
#ifdef CONFIG_SECURITY
        void                    *f_security;
#endif
        
        void                    *private_data;
#ifdef CONFIG_EPOLL
        
        struct list_head        f_ep_links;
        spinlock_t              f_ep_lock;
#endif 
        struct address_space    *f_mapping;
};

文 件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码 中,struct file的指针通常被命名为file或filp。

到此,关于“linux有没有内核文件操作函数”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯