聊聊文件系统的原理

文件系统在操作系统中扮演着关键角色,为用户和应用程序提供了对文件进行操作的基础能力。聊聊文件系统的原理linux内核中,进程管理、内存管理、网络协议栈、文件系统被视为内核的四大核心模块。文件系统在内核中分为vfs(虚拟文件系统)和实际文件系统(如ext4)。vfs作为一种工厂设计模式的抽象层,向外提供标准的posix语义层;而实际文件系统则实现了特定文件功能的磁盘文件系统。具体结构如下图所示:聊聊文件系统的原理

文件系统的IO协议栈中,应用程序如果以dio方式读写文件,请求首先经过内核的vfs,然后到达实际文件系统的处理函数,接着请求进入设备映射,最后传递到块设备的IO层。在这里,调度算法和IO优化也会进行处理。块设备IO层处理完毕后,请求直接到达磁盘的驱动层,这一层通过调用IO命令对磁盘进行读写操作。聊聊文件系统的原理

在Linux中,设计理念是“一切皆文件”,这种理念在文件系统设计中得到了充分体现。内核将目录视为文件来处理。文件的inode中存储的是文件对应的数据块索引和数据,而目录的inode则存储该目录下的文件的inode和文件名称,虽然都是inode,但存储的数据不同。文件系统中的所有目录名称和文件名称存在于vfs层(仅为内存结构展示),这个结构以struct dentry表示,而文件或目录以struct inode表示。聊聊文件系统的原理

每个打开的文件在内核进程中以文件描述符存在,每个进程维护一个数组,这个数组的下标就是返回给应用的文件描述符,数组中的每个元素对应的是struct filestruct file中保存了struct dentry,而struct dentry中包含文件的inode信息。具体关系如下:聊聊文件系统的原理

vfs层提供标准文件操作的函数接口,具体的文件操作函数由实际文件系统提供。针对应用程序访问文件系统,比如执行echo "aaa" > 1.txt命令,cat命令会先根据服务目录查找文件,然后读取1.txt的文件数据,这涉及到部分POSIX函数。整个echo命令在文件系统层面(vfs和实际文件系统)会经历lookup->open->write->close的过程。接下来将重点分析write语义的函数,以内核4.18为例进行分析。

实际文件系统会定义针对文件或目录的相关操作函数,每个inode会有const struct inode_operations *i_opconst struct file_operations *i_fop,实际文件系统的相关操作函数会在__ext4_iget中为对应的inode进行赋值。以下是针对ext4本地文件系统的示例代码:

文心一言 文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

文心一言 1008 查看详情 文心一言

// 这里是以 ext4本地文件系统为例const struct inode_operations ext4_dir_inode_operations = {    // 文件创建函数    .create = ext4_create,    // 查找函数    .lookup = ext4_lookup,    /****** 省略其他的定义的函数*****/};

const struct file_operations ext4_file_operations = {.llseek = ext4_llseek,// 读函数.read_iter = ext4_file_read_iter,// 写函数.write_iter = ext4_file_write_iter,.unlocked_ioctl = ext4_ioctl,

ifdef CONFIG_COMPAT

.compat_ioctl = ext4_compat_ioctl,#endif.mmap = ext4_file_mmap,.mmap_supported_flags = MAP_SYNC,// open函数对应实际文件系统的函数.open = ext4_file_open,.release = ext4_release_file,.fsync = ext4_sync_file,.get_unmapped_area = thp_get_unmapped_area,.splice_read = generic_file_splice_read,.splice_write = iter_file_splice_write,.fallocate = ext4_fallocate,

};

当用户程序发起write的POSIX语义时,请求会进入内核的ksys_write->vfs_write->ext4_file_write_iter来完成这个write操作。整体流程如下:聊聊文件系统的原理

以下是ksys_writevfs_writevfs_write的示例代码:

// write函数进入内核态的ksys_write// fd是已经打开的文件描述符,buf是需要写入的数据,count是写入的长度ssize_t ksys_write(unsigned int fd, const char user *buf, size_t count) {// f 代表打开的文件和打开文件的flagstruct fd f = fdget_pos(fd);ssize_t ret = -EBADF;// 如果打开的文件为空,则退出if (f.file) {// 获取文件读写的位置loff_t pos = file_pos_read(f.file);// 进入vfs_write的函数,接着处理文件写操作ret = vfs_write(f.file, buf, count, &pos);if (ret >= 0)file_pos_write(f.file, pos);fdput_pos(f);}return ret;}

// vfs_write包装了ext4_file_write_iter 函数ssize_t vfs_write(struct file file, const char __user buf, size_t count, loff_t *pos) {ssize_t ret;// 判断文件是否写入,如果不能则返回错误码if (!(file->f_mode & FMODE_WRITE))return -EBADF;if (!(file->f_mode & FMODE_CAN_WRITE))return -EINVAL;if (unlikely(!access_ok(VERIFY_READ, buf, count)))return -EFAULT;// 检查文件系统可写区域以及锁检查ret = rw_verify_area(WRITE, file, pos, count);if (!ret) {if (count > MAX_RW_COUNT)count = MAX_RW_COUNT;file_start_write(file);// 调用ext4_file_write_iter 开始写数据ret = __vfs_write(file, buf, count, pos);if (ret > 0) {fsnotify_modify(file);add_wchar(current, ret);}inc_syscw(current);file_end_write(file);}return ret;}

// vfs_write是包装函数ssize_t vfs_write(struct file file, const char __user p, size_t count, loff_t *pos) {if (file->f_op->write)return file->f_op->write(file, p, count, pos);else if (file->f_op->write_iter)return new_sync_write(file, p, count, pos);elsereturn -EINVAL;}

// 把用户需要写入的数据封装为struct iovec,然后把这个iovec和fd对应的struct file,传递给时间文件系统的函数,进行文件写入。static ssize_t new_sync_write(struct file filp, const char __user buf, size_t len, loff_t ppos) {struct iovec iov = { .iov_base = (void __user )buf, .iov_len = len };struct kiocb kiocb;struct iov_iter iter;ssize_t ret;

init_sync_kiocb(&kiocb, filp);kiocb.ki_pos = *ppos;iov_iter_init(&iter, WRITE, &iov, 1, len);ret = call_write_iter(filp, &kiocb, &iter);BUG_ON(ret == -EIOCBQUEUED);if (ret > 0)    *ppos = kiocb.ki_pos;return ret;

}

// call_write_iter是直接调用f_op->write_iter函数,这里对应的是 ext4_file_write_iter,到了这里虚拟文件系统层基本已经结束,进入实际文件系统的调用过程。static inline ssize_t call_write_iter(struct file file, struct kiocb kio, struct iov_iter *iter) {return file->f_op->write_iter(kio, iter);}

以上就是聊聊文件系统的原理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/466000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 05:26:43
下一篇 2025年11月8日 05:27:46

相关推荐

  • 索拉纳(SOL)手机销量破纪录,Web3硬件是噱头还是未来?

    近期,索拉纳(SOL)生态的Saga手机销量出现戏剧性飙升,从无人问津到迅速售罄,引发了市场的广泛关注。这一现象的核心问题在于:这究竟是昙花一现的投机炒作,还是预示着Web3硬件设备真正未来的来临?本文将深入剖-析Saga手机销量激增背后的真实原因,探讨Web3硬件的核心价值,并对它究竟是“噱头”还…

    2025年12月8日
    000
  • ok交易所官网下载地址是什么

    okx是全球知名的加密资产交易平台之一,致力于为用户提供安全、便捷、高效的数字资产交易及相关服务。平台支持多种加密货币的现货、杠杆、合约、期权等交易产品,拥有强大的技术基础设施和良好的市场流动性。okx注重用户资产安全,采用多层次安全防护措施,服务全球广泛的用户群体。 官方下载地址: OKX交易所 …

    2025年12月8日
    000
  • Gate大门交易所软件旧版本下载安装地址入口

    很多像我一样不小心把gate大门交易所app更新了的朋友,可能都在寻找旧版本的踪迹。这并非单纯的怀旧,更多是基于长期形成的操作习惯、特定设备性能的考量,以及对某些特定功能需求的坚持。用惯了的旧版本感觉确实顺手,下面就分享一下我整理的gate大门交易所软件旧版本下载安装地址入口。 Gate.io 大门…

    2025年12月8日
    000
  • 尖峰上的加密货币:突破潜力和市场采用2025年

    探索2025年最具突破潜力的加密货币,聚焦市场应用、技术创新与社区支持带来的成长动力。 巅峰之上的加密货币:2025年的突破前景与市场采纳 加密行业在2025年持续升温。这次不再是空洞的炒作,而是围绕着具备坚实技术基础、实际应用场景以及活跃社群支撑的项目展开。让我们来看看哪些因素正推动市场采纳,并盘…

    2025年12月8日
    000
  • 币安最新安装入口,新手轻松注册指南

    币安是全球领先的加密货币交易平台之一,提供多种数字资产的交易服务。无论您是新手还是有经验的用户,币安都致力于提供安全、稳定、高效的交易环境。本文将为您详细介绍如何获取币安的官方应用并完成注册,为您开启数字资产交易之旅。本文提供官方应用下载链接,点击本文提供的下载链接即可下载。 获取币安官方应用 为了…

    2025年12月8日
    000
  • iQOO怎么安装欧亿 iQOO手机安装欧亿交易所教程

    iqoo手机用户提出的安装欧亿交易所时,需要用户进行一些特定的操作步骤。本教程将以清晰明了的组合方式,引导用户完成应用的下载与安装过程。 理解安装前的准备工作 在开始具体的安装步骤前,用户需要明白一点。由于区域政策与应用商店上架规则的限制,像欧亿这类全球性的数字资产交易平台应用,通常不会在iQOO手…

    2025年12月8日
    000
  • 荣耀手机怎么安装欧意-荣耀手机安装欧亿交易所教程

    荣耀手机用户提供一个关于如何安装欧意(也被称作欧亿)应用程序的详细指引。对于部分用户在标准应用商店中找不到该应用的情况,本教程将介绍一种直接有效的安装路径。 安装前的准备事项 在开始具体的安装流程前,请确保您的荣耀手机满足一些基本条件,这有助于整个过程的顺利进行。 网络环境:连接到一个稳定且速度较快…

    2025年12月8日
    000
  • vivo手机怎么装币安 vivo手机安装币安交易所教程

    如何在vivo品牌的智能手机上成功安装币安(binance)交易所的应用程序。对于许多数字资产爱好者来说,在手机上便捷地使用交易平台是日常操作的一部分。vivo手机作为安卓生态的一员,其安装第三方应用的方式既有通用性,也存在一些因系统定制而产生的细微差别。接下来的内容将引导用户完成整个安装过程。 安…

    2025年12月8日
    000
  • OPPO手机能装币安吗 OPPO怎么安装币安

    关于“oppo手机能装币安吗”这个问题,其核心并非是oppo这一手机品牌本身的技术壁垒,更多是涉及到应用程序的分发渠道、区域性政策以及操作系统权限等多个层面的综合性问题。简单来说,这个问题的答案不是绝对的“能”或“不能”,而是取决于用户所处的环境和所选择的安装方式。 核心问题的拆解:系统、区域与安装…

    2025年12月8日
    000
  • 小米手机怎么安装币安

    在数字经济浪潮中,加密资产的交易平台成为了连接个人与全球金融脉络的重要枢纽。许多用户渴望在便捷的移动设备上管理这些数字财富,而小米手机因其卓越的性能和广泛的用户基础,自然成为了首选。然而,将binance(币安)这样的专业级应用部署到您的爱机上,有时并不像在应用商店中点击“安装”那样简单直观。这其中…

    好文分享 2025年12月8日
    000
  • 华为能装币安吗?华为手机怎么安装币安

    华为能装币安吗?华为手机怎么安装币安?华为设备持有者,在尝试获取和使用币安(binance)应用程序时所面临的普遍困境。由于某些区域的监管政策、应用商店的限制或特定机型的兼容性考量,用户可能无法直接通过官方应用商店下载币安。面对这样的情况,了解替代的安装途径和操作流程变得尤为重要。 理解APK安装机…

    好文分享 2025年12月8日
    000
  • 安蒂尔(Antier)用Stablecoin Raas革新汇款:跨境支付的新时代

    安提埃(antier)正引领跨境支付费用的变革,通过将稳定汇款(raas)整合进其加密新银行解决方案中,实现金融操作的新突破。 安蒂尔(Antier)利用Stablecoin Raas革新汇款:开启跨境支付新时代 安提埃(Antier)站在跨境支付转型的最前线,其推出的稳定汇款即服务(RAAS)已无…

    2025年12月8日
    000
  • 欧易下载官方入口 欧易怎么下

    您可以通过欧易官网或应用商店下载安装欧易APP,具体步骤如下:1.访问欧易官网并选择设备类型下载APK或iOS版本;2.Android用户需允许未知来源安装或通过Google Play下载;3.iOS用户点击跳转App Store或使用TestFlight安装;4.也可直接在应用商店搜索“OKX”并…

    2025年12月8日
    000
  • 币安APP官方正版安全链接 币安官方APP正版v2.105.3安装入口

    它更是一个庞大的生态系统,为用户提供全方位的数字资产服务。从现货交易到期货交易,从杠杆交易到期权交易,币安涵盖了几乎所有主流的数字资产交易方式。此外,币安还提供诸如币安宝、流动性挖矿、新币挖矿等多种理财产品,帮助用户实现数字资产的增值。 币安 Binance 交易所 尤其注重用户体验,其简洁明了的界…

    2025年12月8日
    000
  • 火币在线入口 火币app下载教程最新版

    火币App下载教程最新版如下:步骤一,访问火币官网,确认网址正确性并选择所在地区的官方网站;步骤二,找到App下载入口,根据手机操作系统选择Android版或iOS版;步骤三,选择下载方式,包括扫描二维码、直接下载安装包或跳转到应用商店下载;步骤四,安装App,若为安装包下载需允许安装未知来源应用,…

    2025年12月8日
    000
  • 币安Binance官方APP最新版 币安BinanceAPP官方最新版入口

    数字货币的世界日新月异,选择一个安全、可靠、便捷的交易平台至关重要。币安(Binance)作为全球领先的数字资产交易平台,凭借其卓越的安全性、丰富的币种选择、流畅的用户体验,赢得了全球数百万用户的信赖。为了确保您能够访问到官方最新版本的币安APP,并享受到最完善的功能和服务,我们为您提供以下官方入口…

    2025年12月8日
    000
  • 易欧交易所在线入口 易欧交易所app下载

    要安全访问易欧交易所并下载App进行交易,需通过官方渠道找到正确入口并完成账户设置。1. 通过官方社交媒体或可信导航网站验证并进入易欧交易所官网;2. 注册或登录账户后浏览市场并进行交易;3. 在官网首页找到App下载入口,根据手机系统选择iOS或Android版本下载安装;4. 登录App后开启双…

    2025年12月8日
    000
  • 必安交易所在线入口 必安app下载binance

    要下载币安App并开启数字货币交易,需先访问官网找到下载入口,选择对应操作系统,完成安装及登录。1. 访问币安官网binance.com,确认网址安全;2. 在首页或底部点击“下载”进入应用页面;3. 根据手机类型选择iOS或Android版本;4. Android用户可下载APK或通过Google…

    2025年12月8日
    000
  • 易欧在线入口 易欧app下载

    要安全访问易欧(OKX)平台并下载官方App,请务必通过搜索引擎搜索“OKX”或“易欧”,认准域名okx.com的官网链接,避免点击不明来源的入口;下载App时,iOS用户应通过App Store搜索官方开发者发布的应用,Android用户可通过官网二维码或信誉良好的第三方商店下载;注册账户时选择手…

    2025年12月8日
    000
  • OKX欧义交易所最新中文版客户端注册入口

    OKX 欧易交易所,作为全球领先的数字资产交易平台,一直致力于为用户提供安全、稳定、便捷的交易体验。为了更好地服务广大中文用户,OKX 欧易推出了最新的中文版客户端,无论您是经验丰富的交易员,还是刚刚踏入数字货币领域的新手,这款客户端都将成为您探索数字资产世界的理想工具。 现在,就让我们一起探索如何…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信