linux文件系统(二) - 虚拟文件系统

虚拟文件系统这一层提供的大多数是形如vfs_xxx的函数,他们最终调用的还是各个具体的文件系统注册给虚拟文件系统的struct inode_operations和struct file_operations等结构体中的一些操作函数。以fat文件系统为例,他注册的struct inode_operations和struct file_operations如下:

//fs/fat/namei_vfat.c
static const struct inode_operations vfat_dir_inode_operations = {
        .create         = vfat_create,
        .lookup         = vfat_lookup,
        .unlink         = vfat_unlink,
        .mkdir          = vfat_mkdir,
        .rmdir          = vfat_rmdir,
        .rename         = vfat_rename,
        .setattr        = fat_setattr,
        .getattr        = fat_getattr,
};

//fs/fat/file.c
const struct file_operations fat_file_operations = {
        .llseek         = generic_file_llseek,
        .read           = do_sync_read,
        .write          = do_sync_write,
        .aio_read       = generic_file_aio_read,
        .aio_write      = generic_file_aio_write,
        .mmap           = generic_file_mmap,
        .release        = fat_file_release,
        .unlocked_ioctl = fat_generic_ioctl,
        .fsync          = fat_file_fsync,
        .splice_read    = generic_file_splice_read,
};

open系统调用

//fs/open.c
SYSCALL_DEFINE3(open, const char __user *, filename, ...)
    do_sys_open
        do_filp_open //fs/namei.c
            path_openat
                do_last
                    lookup_open
                        vfs_create
                        finish_open
                            do_dentry_open
                                f->f_op = fops_get(inode->i_fop);

在open的时候会将inode中结构体struct file_operations i_fop保存的函数指针赋值给file中的结构体struct file_operations f_op,以后read,write等函数调用的都是这里的struct file_operations结构体中的回调函数。


write系统调用

//fs/read_write.c
SYSCALL_DEFINE3(write, ...
    vfs_write
        file->f_op->write (fat文件系统为do_sync_write)
        do_sync_write
            filp->f_op->aio_write (fat文件系统为generic_file_aio_write)
            generic_file_aio_write //mm/filemap.c
                __generic_file_aio_write
                    generic_file_buffered_write
                        generic_perform_write
                            a_ops->write_begin
                            iov_iter_copy_from_user_atomic
                            a_ops->write_end

首先,系统调用write会调用虚拟文件系统中的函数vfs_write,vfs_write最终会调用fat文件系统注册的struct file_operations函数中的f_op->aio_write函数,generic_file_aio_write是在mm/filemap.c文件中实现的函数,这个函数会将数据写到page cache中,等待回写线程来将page cache写到磁盘中。


mkdir系统调用

//fs/namei.c
SYSCALL_DEFINE2(mkdir, ...
    sys_mkdirat
SYSCALL_DEFINE3(mkdirat, ...
    vfs_mkdir(struct inode *dir, struct dentry *dentry, ...)
        dir->i_op->mkdir

mkdir系统调用与write系统调用不一样,他会调用inode中的struct inode_operations结构体中的函数,而write系统调用调用的是file中的struct file_operations结构体中的函数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckywang1103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值