- 1、本文档共41页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
10-3Linux操作系统 - 文件系统
读取文件某个位置的数据。 给定的位置是相对于文件而不是相对于磁 盘的,因此需要根据该位置计算出它在 i_block中的下标, 得到在磁盘上的位置。 三、 磁盘块的分配与释放 磁盘块的释放 主要工作是修改块位图和 涉及块的统计变量。 磁盘块的分配 先试图与上次分配给文件的块连续。 如果不行,则试图在附近32个块的范围内分配。 还不行的话再本组内向前找八个连续空闲的块。 若还不满足则任何空闲的块均可以。 还不满足的话则到其它的组中去寻找。 目的 文件尽可能地连续分配使文件访问时 间变短 10.3.3 主要文件系统系统调用处理流程 一 、 文件的open()操作 open()函数最终会调用内核的sys_open() 第一个参数是打开文件的路径名 第二个参数文件的访问标志 (1)用get_unused_fd()在current-files-fd所指向的文件对象指针数组中查找一个未使用文件号,存储在局部变量fd中。 (2) 调用filp_open()函数,工作主要分成两步: 第一步:调用open_namei()函数,找到目标结点(可以是文件、目录)所对应的dentry对象,与dentry对象相对应的inode对象此时也应该在物理内存中 第二步 :调用dentry_open()函数,该函数申请一个file对象空间,然后初始化该对象,其中的一步使file对象的f_dentry指向已获得的dentry对象。 (3) 调用fd_install()函数将文件对象装入当前进程的打开文件表: current-files-fd[fd] = file; 然后返回文件号fd 最重要的步骤是open_namei()完成的。 函数的执行过程如下: a.确定从哪一个dentry对象出发进行路径解析。根据指定文件路径名是相对路径还是绝对路径从current中得到相应的dentry对象。 b.调用path_walk()函数进行路径解析 该函数执行一个循环,每一循环都是得到一个dentry对象,该对象对应文件路径的一个子路径。 每次循环的具体过程如下: b.1 如果子路径是“.”表示当前目录,则应该进行下一次循环。 b.2 如果子路径是“..”表示父目录,则要看当前dentry对象的情况。 若当前entry对象已经是本进程的根目录,这时应保持不变,直接进行下一次循环; 若当前dentry对象与父目录在同一设备上,则dentry对象的d_parent成员即为所求 若当前dentry对象为所在设备的根节点,它的上一层必然是另一个设备,此时应把dentry对象改成安装点的dentry对象再从头执行b.2。 b.3 调用cache_lookup()函数查找子路径对应的dentry是否已经在dentry cache中,如果有,则返回。 b.4 此时应该到磁盘上寻找,先申请dentry对象空间存放即将查找的信息,然后调用real_lookup()函数,该函数将调用父目录inode对象的i_op-lookup()方法。 lookup()方法是特定于文件系统的,ext2的lookup方法是ext2_lookup()函数,它首先从磁盘读入dentry对象信息,包括dentry对象对应的inode号。然后再查找相应的inode对象是否在inode cache中,如果不在,申请一个inode对象空间再从磁盘读入信息。最后,让dentry对象的d_inode成员指向该inode对象。 b.5 已经找到子路径的dentry对象。但还有两种情况值得考虑,一是该dentry对象是一个安装点,这种情况下要推进到所安装设备的根节点。另一情况是该dentry对象是一个连接(link),这种情况下要推进到连接目标 二、 文件的read()操作 1. 页缓冲(page cache) 为了减少I/O操作的次数Linux在读写文件时采用了页缓冲的机制 在内核中文件被看成由页面组成,对文件的读写首先要经过页缓冲。 每个文件的所有页面由一个struct address_space 结构管理,struct inode结构中的i_mapping成员即起这个作用。 struct address_space { struct list_head clean_pages; struct list_head dirty_pages; struct address_space_operations *a_ops;/*操作方法 }; struct address_space_operations { int (*writepage)(struct page *);
您可能关注的文档
最近下载
- 角色模型制作综合规范.pdf VIP
- 汛期居民转移安置点疫情防控工作方案.doc VIP
- 最新BG201使用说明书20121024.pdf VIP
- 车辆维修定点服务项目投标方案(技术标).pdf
- 政府招聘人员协议书.docx VIP
- 2022电网生产调度系统检修工程预算编制与计算方法.docx VIP
- 吸入用一氧化氮-药品临床应用解读.pptx VIP
- Unit 1 Helping at home Part A 第1课时课件2025-2026学年度人教PEP英语四年级上册.pptx VIP
- 《GB3095-2012 环境空气质量标准》.pdf VIP
- GB21148-2020 足部防护 安全鞋.pdf VIP
文档评论(0)