首页 > 系统相关 >Linux内核文件系统-虚拟文件系统-文件操作

Linux内核文件系统-虚拟文件系统-文件操作

时间:2024-10-21 10:50:57浏览次数:7  
标签:struct int loff 文件系统 unsigned 内核 file Linux

建议点击这里查看个人主页上的最新原文

点击这里在哔哩哔哩bilibili在线观看配套的教学视频

点击这里在哔哩哔哩bilibili在线观看配套的加餐视频(就是一些补充)

点击跳转到内核课程所有目录

一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。

虚拟文件系统英文全称Virtual file system,缩写为VFS,又称为虚拟文件切换系统(virtual filesystem switch)。所有的文件系统都要先经过虚拟文件系统层,虚拟文件系统相当于制定了一套规则,如果你想写一个新的文件系统,只需要遵守这套规则就可以了。

VFS虽然是用C语言写的,但使用了面向对象的设计思路。

文件对象中最重要的一个成员是f_op,你会发现,文件操作方法名和很多系统调用很像。

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 (*write) (struct file *, const char __user *, size_t, loff_t *); // 写入数据并更新指针
        ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*iopoll)(struct kiocb *kiocb, struct io_comp_batch *,
                        unsigned int flags);
        int (*iterate_shared) (struct file *, struct dir_context *); // v6.6在iterate_dir中加读锁,但在较早的版本(如v4.19)有些文件系统未实现此方法时加写锁
        __poll_t (*poll) (struct file *, struct poll_table_struct *); // 睡眠等待给定文件活动
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); // 不需要持有BKL,相比compat_ioctl,优先实现此方法
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long); // 可移植变种,也不需要持有BKL
        int (*mmap) (struct file *, struct vm_area_struct *); // 将文件映射到地址空间上
        unsigned long mmap_supported_flags;
        int (*open) (struct inode *, struct file *); // 创建新的文件对象,与inode关联
        int (*flush) (struct file *, fl_owner_t id); // 已打开文件的引用计数减少时调用,作用取决于具体的文件系统
        int (*release) (struct inode *, struct file *); // 当引用计数为0时调用,作用取决于具体的文件系统
        int (*fsync) (struct file *, loff_t, loff_t, int datasync); // 所有文件的缓存数据写回磁盘
        int (*fasync) (int, struct file *, int); // 打开或关闭异步IO的通告信号
        int (*lock) (struct file *, int, struct file_lock *); // 给文件上锁
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); // 获取未使用的地址空间来映射给定的文件
        int (*check_flags)(int); // 检查fcntl()系统调用的flags的有效性,只有nfs实现了
        int (*flock) (struct file *, int, struct file_lock *); // 提供忠告锁
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
        void (*splice_eof)(struct file *file);
        int (*setlease)(struct file *, int, struct file_lock **, void **);
        long (*fallocate)(struct file *file, int mode, loff_t offset,
                          loff_t len);
        void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMU
        unsigned (*mmap_capabilities)(struct file *);
#endif
        ssize_t (*copy_file_range)(struct file *, loff_t, struct file *,
                        loff_t, size_t, unsigned int);
        loff_t (*remap_file_range)(struct file *file_in, loff_t pos_in,
                                   struct file *file_out, loff_t pos_out,
                                   loff_t len, unsigned int remap_flags);
        int (*fadvise)(struct file *, loff_t, loff_t, int);
        int (*uring_cmd)(struct io_uring_cmd *ioucmd, unsigned int issue_flags);
        int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *,
                                unsigned int poll_flags);
} __randomize_layout;

标签:struct,int,loff,文件系统,unsigned,内核,file,Linux
From: https://blog.csdn.net/chenxiaosongcsdn/article/details/143101683

相关文章

  • Linux | CentOS7安装Java17的详细步骤
    步骤1:更新系统在安装Java之前,确保系统包是最新的。sudoyumupdate-y步骤2:下载Java17从Oracle官方网站或AdoptOpenJDK下载Java17。如果使用OracleJDK,可以到Oracle网站下载。如果使用AdoptOpenJDK,可以使用以下命令:wgethttps://github.com/adoptium/temurin17-bina......
  • 0-1新手小白Linux安装细节注意项
    一、发行版Linux有很多发行版,比较知名的有ReadHat、Debian、arche、Android等分支。包括所见的大多数发行版也都以这些为基础和衍生出来的版本,比如Centos是ReadHat的一个分支,Ubunut是Debian的一个分支。这里你想要安装的Linux可以是任何版本。他们的安装方法基本都大同小异,除......
  • linux命令
    linux命令1.远程连接linux1.1windows的指令终端连接linux打开终端语法:ssh用户名@ip地址比如:[email protected]等远程工具2.常用指令#远程登录linux系统sshroot@ip地址#断开连接exit#重启系统reboot或者shutdown-rnow#关机指令shutdown......
  • 【笔记】CSE 365 - Fall 2024之Linux Luminarium(pwn.college)
    【笔记】CSE365-Fall2024之LinuxLuminarium(pwn.college)HelloHackers本模块将教你与命令行交互的基础知识!命令行允许您执行命令。当您启动终端时,它将执行命令行“shell”,如下所示:hacker@dojo:~$这称为“prompt”,它会提示您输入命令。让我们来看看这里发生了什么:提示......
  • Linux DMA Engine framework(2)_功能介绍及解接口分析
    1.前言从我们的直观感受来说,DMA并不是一个复杂的东西,要做的事情也很单纯直白。因此Linuxkernel对它的抽象和实现,也应该简洁、易懂才是。不过现实却不甚乐观(个人感觉),Linuxkerneldmaengineframework的实现,真有点晦涩的感觉。为什么会这样呢?如果一个软件模块比较复杂、晦涩,要......
  • Linux DMA Engine framework(3)_dma controller驱动
    1.前言本文将从provider的角度,介绍怎样在linuxkerneldmaengine的框架下,编写dmacontroller驱动。2.dmacontroller驱动的软件框架设备驱动的本质是描述并抽象硬件,然后为consumer提供操作硬件的友好接口。dmacontroller驱动也不例外,它要做的事情无外乎是:1)抽象并控制DMA控......
  • 虚拟文件系统和文件系统的挂载
    虚拟文件系统虚拟文件系统(VFS)屏蔽了不同文件系统的差异和操作细节,向上为用户提供了文件操作的统一调用接口,如图4.24所示。当用户程序访问文件时,通过VFS提供的统一调用函数(如open()等)来操作不同文件系统的文件,而无须考虑具体的文件系统和实际的存储介质。虚拟文件系统采......
  • Linux
    LinuxLinux系统启动过程Linux关机不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。关机的命令有shutdown–hnow,halt,poweroff和init0,重启系统的命令有shutdown–rnow,reboot,init6。图形模式与文字模式的切换方式命令窗口切换的......
  • 【Linux】命令行参数&&环境变量
    文章目录命令行参数环境变量环境变量的概念常见环境变量查看环境变量测试PATH修改PATHHOME和环境变量相关的命令环境变量是如何被组织的通过系统调用putenv和getenv获取或设置环境变量环境变量通常是具有全局属性的普通变量与环境变量的区别命令行参数main函数有三......
  • 《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优
    1.题记有关Linux关键内核参数的调整,我前面的调优文章其实就有涉及到,只是比较零散,本篇集中深入介绍Linux常用关键内核参数及其调优,Linux调优80%以上都涉及到内核的这些参数的调整。2.文件系统相关参数fs.file-max参数说明::控制系统中打开文件描述符的数量上限。默认值......