第 8 章 虚拟文件系统(7)

news2024/9/23 19:25:33

目录

8.5 标准函数

8.5.1 通用读取例程

8.5.2 失效机制

8.5.3 权限检查

8.6 小结


本专栏文章将有70篇左右,欢迎+关注,查看后续文章。

8.5 标准函数

大多数文件系统中 file_operations 的 read,write 分别为:

        do_sync_read,do_sync_write。

如:

const   struct file_operations    ext4_file_operations   =   {

        .read    =    do_sync_read,

        .write    =    do_sync_write,

        ...

}

inode 是文件属性,而不是数据本身,数据存在块设备中。

内存保存块设备数据的方式:

        1. mmap映射:

                即映射到用户虚拟地址空间。

                特点:适用大文件,不预加载,访问时加载,不浪费内存。

        2. 页缓存:

                缓存到内核内存中。

                特点:

                        预加载,加速读写,进程通过标准文件读写操作。

                        适用小文件,不立即写回块设备。

所以读写文件时,需先查询数据是否缓存在内存?

        若在缓存,则读写页缓存,否则向块设备发出读请求。

拓展

fd   =   open("myfile",    O_RDWR | O_CREAT | O_SYNC | O_DIRECT,    S_IRUSR | S_IWUSR);

        O_DIRECT:不使用内核缓冲区,直接读写磁盘文件。

        O_SYNC:以同步IO方式,打开文件。

O_DIRECT:

        含义:

                用户空间直接读磁盘文件,绕过页高速缓存。也称裸IO(RAW IO)。

        应用场景:

                性能要求极高的场景,如数据库系统(需快速访问大量数据)。

        注意:

                1. 一个进程以O_DIRECT访问文件,而另一进程以页缓存打开同一文件,两个进程读写数据可能不一致。

                2. 某些文件系统可能不支持O_DIRECT。如某些网络文件系统。

                3. 通常结合O_SYNC或O_DSYNC,以确保数据的完整性和一致性。

O_SYNC:

        含义:

                写操作后,数据不仅写到内核缓冲区,还要同步刷新到磁盘。

        好处:

                实现数据同步。

O_SYNC 和 O_DSYNC 区别:

        O_DSYNC 不要求元数据的同步。

        O_SYNC 要求数据和元数据都要同步。

8.5.1 通用读取例程

struct   file_operations    ext4_file_operations    =    {

        .read    =    do_sync_read,

                // 同步读,将阻塞调用进程。

        .aio_read    =    generic_file_aio_read,

                // 异步读,提交请求后,立即返回,不必等待数据读取完成。

};

ssize_t    do_sync_read(struct file    *filp,    char __user   *buf,    size_t   len,    loff_t   *ppos)

{

        struct iovec    iov   =   { .iov_base  =   buf,    .iov_len   =   len };

        struct kiocb    kiocb;

        init_sync_kiocb( &kiocb,    filp );

        kiocb.ki_pos    =    *ppos;

        kiocb.ki_left    =    len;

        kiocb.ki_nbytes    =    len;

        ret    =    filp->f_op->aio_read(&kiocb,    &iov,    1,    kiocb.ki_pos);

                //aio_read 指向 generic_file_aio_read()

        if (-EIOCBQUEUED    ==    ret) 若读请求正在排队

                ret    =    wait_on_sync_kiocb(&kiocb); //阻塞,等待读完成。

        *ppos    =    kiocb.ki_pos;

        return    ret;

}

1. 异步读取

内核异步读函数如下:

2. 从映射中读取

do_generic_mapping_read():已被淘汰。

原理如下:

操作流程:

         1. 检查文件内容是否在页缓存中。

                struct page    *find_get_page(struct address_space    *mapping,    pgoff_t    offset)

                使用方法:

                        page    =    find_get_page(filp->i_mapping,    index);

                作用:

                        检查某文件的指定偏移是否被缓存到内存页上。

        2. 若没有缓存,则预读并缓存。

                page_cache_sync_readahead()

        3. 用 Page_Uptodate 检查,页缓存数据是否是最新的。

                若不是最新,调用mapping->a_ops_readpage:从块设备读数据到页。

        4. 若页是最新,调用 mark_page_accessed。

                void    mark_page_accessed(struct page    *page);

                作用:

                        更新页访问的时间戳,选择换出的页时使用该标记。

                注意:

                        匿名页不需要更新访问时间戳。

        5. 将页映射到用户地址空间

                即actor函数指针。

        PageAnon():

                作用:检查页面是否是匿名页面。

        PageReferenced()

                作用:检查是否已被访问过。

预读机制:

8.5.2 失效机制

filemap_fault:

        作用:

                读取未保存在缓存中的页。

        最终也调用:

                struct   address_space   mapping -> a_ops -> readpage();

8.5.3 权限检查

int    inode_permission(struct   inode    *inode,    int   mask)

        作用:

                检查是否允许以指定权限访问inode。

        使用场景:

                chdir/chroot系统调用。

int    inode_permission(struct inode  *inode,    int   mask)

{

        sb_permission(inode->i_sb,    inode,    mask);

        __inode_permission(inode,    mask);

}

mask:

        即检查是否可以访问的权限。

        如MAY_READ,MAY_WRITE,MAY_EXEC。

1. sb_permission:

                若mask = MAY_WRITE,根据 sb->s_flags 确认不是只读文件系统。

2. __inode_permission:

        通常调用:generic_permission(inode,   mask);

                包括 check_acl()

struct   inode_operations    sysfs_inode_operations    =    {

        .permission    =    sysfs_permission,

                //也调用 generic_permission(inode,    mask);

};

sysfs_permission  ->  generic_permission  ->  check_acl

检查用户,组,other的 inode 权限。

8.6 小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android开发之事件分发

#来自ウルトラマンゼロ(哉阿斯) 1 Activity 构成 平常布局展示在ContentView中。 2 事件分发 事件分发的本质其实就是把事件(Touch)封装成 MotionEvent 类,然后传递给 View 的层级处理。 MotionEvent 事件类型主要有…

51单片机-第七节-DS1302实时时钟

一、DS1302介绍: 实时时钟芯片,可对年,月,日,周,时,分,秒计时,是一种集成电路。 二、DS1302原理: 1.寄存器定义: Command:操作模式…

MySQL:表的增删查改——CRUD(二)

本篇博客接上篇:MySQL:表的增删查改——CRUD(一)-CSDN博客 目录 1、查询(Retrieve) 1.1 条件查询:WHERE 1.1.1 比较运算符 1.1.2 逻辑运算符 1.1.3 查询语句的执行顺序 1.1.3 SQL代码示例…

小试牛刀-walletconnect二维码及交互

目录 1.编写目的 2.实现功能 3.功能详解 依赖组件 3.1 二维码生成 3.1.1 初始化SignClient 3.1.2 创建会话空间获取WC协议uri 3.1.3 生成二维码供用户扫描 3.1.4 等待扫描 3.2 发送交易事务 3.2.1 创建交易事务 3.2.2 向用户发送交易事务 3.3 签名事务 3.3.1 接收…

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展,AI绘图工具在图像生成和艺术创作方面变得越来越强大,无论你是一个设计师、艺术家,还是仅仅对生成艺术感兴趣的爱好者,AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中,…

医疗设备漏费控制管理系统的必然性及未来发展性

医疗设备控费的必然性 医疗改革的要求 随着医疗改革的不断深入,原有的医药模式已经发生了改变。药品和耗材零差价的执行,使得医院需要寻找新的开源节流、降耗增效的方法。医疗设备控费系统的出现,正是为了满足这种管理需求。 控制成本和优…

【AI】人工智能核心三要素

上图来自甲子光年的资料,如有侵权,请联系删除。 在当今科技飞速发展的时代,人工智能(AI)作为引领未来科技变革的重要力量,正以前所未有的速度改变着我们的生活、工作乃至整个社会的面貌。人工智能之所以能…

文件Io编程基础

1. 标准I/O (stdio.h) stdio.h 是标准C库的头文件,包含了输入输出函数的声明。位置:/usr/include/stdio.h 2. 文件I/O操作步骤 打开文件: 使用 fopen 函数,返回 FILE* 指针。读/写操作: 使用 fread、fwrite、fgets、fputs、fprintf、fscan…

【SOC】SoC架构系统总线的QoS管理——QoS generator

#工具文档理解# QoS——Quality of Service 目录 一、概念 Master对于Latency的敏感性 流量控制和事务级概念 Splitting Pending order IDs 数据包创建和传输的QoS 序列化 一、概念 这一部分描述了QoS机制如何平衡不同发起者的流量访问,以适应互连的有限可…

都2024年了,SQL语句还需要手写吗?

前言 在当今的AI时代,数据库管理和SQL开发已不再是单调的编码过程。借助AI的智能化工具,数据库操作变得更加简洁高效,错误率也大大降低。特别是当AI与强大的数据库管理工具Navicat相结合时,开发者可以更加专注于数据的分析和应用…

home assistant 接入国家电网

一、安装加载项 在 配置 - 加载项 File editorAdvanced SSH & Web Terminal 二、安装state_grid 上传压缩包 在 File editor中,进入 homeassistant - custom_components 文件夹中,点击上传文件。 文件下载路径 https://download.csdn.net/downl…

密码学基础-身份认证

密码学基础-身份认证 概述 书信的亲笔签名;公文、证书的印章起到了核准、认证的功能。 如前文密码学基础-数据加密所述,信息安全少不了身份认证的话题。只有认证了信息的来源,我们才能知道这条信息是否是正确的,合法的&#xff…

如何让贵人一直帮你?

如果有贵人提携了你一把,牢记一定要抱住大腿。 如果一个段位比你高很多的贵人帮了你一个忙,他什么都不缺,他缺的也不是你这个层次的人能够给的了的,但你千万不要以为这个事儿就翻篇儿了。牢记一招,每隔半年给他汇报一下…

超声波眼镜清洗机有用吗?品质上等的超声波清洗机评选

超声波眼镜清洗机有用吗?眼镜是我们日常生活中不可或缺的配件,其卫生状况对健康至关重要。由于眼镜经常与外界环境接触,容易积聚细菌。为了有效解决这一问题,大家都纷纷选择使用超声波清洗机来进行彻底清洁。所以,超声…

C语言基础知识点(十三)结构体的深拷贝与浅拷贝

在C或C等语言中,结构体(Struct)是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的类型。对于结构体的拷贝,存在深拷贝(Deep Copy)和浅拷贝(Shallow Copy&#x…

DataWhale市场博弈和价格预测

文章目录 市场博弈和价格预测任务数据出清价格的形成步骤代码运行 Task1:跑通baseline使用ABM估计市场出清价格转换耗煤量为机组报价保存结果为submit.csv Task2:时间序列挖掘ABM构建学习数据基本信息统计指标分析数据分布分时统计特征不同小时的总负荷和…

错误代码0x80004005:全面解析与解决策略

在Windows操作系统中,错误代码0x80004005是一个相当常见的提示,它通常表示一个未指定的错误或一个无法找到的错误。这个错误可能出现在多种场景中,包括软件安装、系统更新、网络连接、文件操作等。由于其普遍性和模糊性,理解和解决…

搭建链路追踪系统 Jaeger

搭建链路追踪系统 Jaeger 架构 架构图 架构设计 在设计以 Jaeger 为中心的链路追踪系统时,我们采用微服务架构模式。 Jaeger 作为核心追踪系统,负责收集、存储和展示分布式追踪数据。Elasticsearch 作为后端存储,提供数据的持久化和高效…

网鼎杯之unfinish

题目来源:网鼎杯 2018 题目描述:SQL 问题:给一个页面,如何判断其有漏洞 通过awvs扫描得知存在 register.php 注册页面,并且注册界面存在SQL盲注漏洞。 题目提示SQL,在注册页面测试无果,且发现输…

解决Ubuntu报“无法解析域名cn.archive.ubuntu.com“问题

今天在Ubuntu系统上,使用sudo apt update命令,进行更新时,弹出"无法解析域名 cn.archive.ubuntu.com"问题,如图(1)所示: 图(1) 弹出"无法解析域名 cn.archive.ubuntu.com" 错误 出现这种现象的原因…