电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

read系统调用流程

14页
  • 卖家[上传人]:M****1
  • 文档编号:512206696
  • 上传时间:2023-10-17
  • 文档格式:DOCX
  • 文档大小:175.92KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、Read系统调用在用户空间中的处理过程Linux系统调用(SCI,systemcallinterfaced的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是0x80中断这个入口点(X86系统结构)。也就是说,所有系统调用都从用户空间中汇聚到0x80中断点,同时保存具体的系统调用号。当0x80中断处理程序运行时,将根据系统调用号对不同的系统调用分别处理(调用不同的内核函数处理)。系统调用的更多内容,请参见参考资料。Read系统调用也不例外,当调用发生时,库函数在保存read系统调用号以及参数后,陷入0x80中断。这时库函数工作结束。Read系统调用在用户空间中的处理也就完成了。回页首Read系统调用在核心空间中的处理过程0x80中断处理程序接管执行后,先检察其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理read系统调用的内核函数sys_read,最后传递参数并运行sys_read函数。至止匕,内核真正开始处理read系统调用(sys_read是read系统调用的内核入口)。在讲解read系统调用在核心空间中的处理部分中,首先介绍了内核处理磁盘请求的层次模

      2、型,然后再按该层次模型从上到下的顺序依次介绍磁盘读请求在各层的处理过程。Read系统调用在核心空间中处理的层次模型图1显示了read系统调用在核心空间中所要经历的层次模型。从图中看出:对于磁盘的一次读请求,首先经过虚拟文件系统层(vfslayer),其次是具体的文件系统层(例如ext2),接下来是cache层(pagecache层)、通用块层(genericblocklayer)、IO调度层(I/Oschedulerlayei)、块设备驱动层(blockdevicedriverlayer),最后是物理块设备层(blockdevicelayer)VFSLayerBlockDeviceDriverLayerBlockDeviceLayer虚拟文件系统层的作用:屏蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口。正是因为有了这个层次,所以可以把设备抽象成文件,使得操作设备就像操作文件一样简单。在具体的文件系统层中,不同的文件系统(例如ext2和NTFS)具体的操作过程也是不同的。每种文件系统定义了自己的操作集合。关于文件系统的更多内容,请参见参考资料。引入cache层的目的是为了

      3、提高linux操作系统对磁盘访问的性能。Cache层在内存中缓存了磁盘上的部分数据。当数据的请求到达时,如果在cache中存在该数据且是最新的,则直接将数据传递给用户程序,免除了对底层磁盘的操作,提高了性能。通用块层的主要工作是:接收上层发出的磁盘请求,并最终发出IO请求。该层隐藏了底层硬件块设备的特性,为块设备提供了一个通用的抽象视图。IO调度层的功能:接收通用块层发出的IO请求,缓存请求并试图合并相邻的请求(如果这两个请求的数据在磁盘上是相邻的)。并根据设置好的调度算法,回调驱动层提供的请求处理函数,以处理具体的IO请求。驱动层中的驱动程序对应具体的物理块设备。它从上层中取出IO请求,并根据该IO请求中指定的信息,通过向具体块设备的设备控制器发送命令的方式,来操纵设备传输数据。设备层中都是具体的物理设备。定义了操作具体设备的规范。相关的内核数据结构:Dentry:联系了文件名和文件的i节点inode:文件i节点,保存文件标识、权限和内容等信息file:保存文件的相关信息和各种操作文件的函数指针集合file_operations:操作文件的函数接口集合address_space描述文

      4、件的pagecache结构以及相关信息,并包含有操作pagecache的函数指针集合address_space_operations操作pagecache的函数接口集合bio:IO请求的描述数据结构之间的关系:图2示意性地展示了上述各个数据结构(除了bio)之间的关系。可以看出:由dentry对象可以找到inode对象,从inode对象中可以取出address_space对象,再由address_spac取寸象找至Uaddress_space_operationS寸象。File对象可以根据当前进程描述符中提供的信息取得,进而可以找到dentry对象、address_spac取寸象和file_operations对象。图2数据结构关系图:前提条件:对于具体的一次read调用,内核中可能遇到的处理情况很多。这里举例其中的一种情况:要读取的文件已经存在文件经过pagecache要读的是普通文件磁盘上文件系统为ext2文件系统,有关ext2文件系统的相关内容,参见参考资料准备:注:所有清单中代码均来自内核原代码读数据之前,必须先打开文件。处理open系统调用的内核函数为sys_open。所以我

      5、们先来看一下该函数都作了哪些事。清单1显示了sys_open的正码(省略了部分内容,以后的程序清单同样方式处理)清单1sys_open函数代码asmlinkagelongsys_open(constchar_user*filename,intflags,intmode)fd=get_unused_fd();if(fd=0)structfile*f=filp_open(tmp,flags,mode);fd_install(fd,f);一returnfd;代码解释:get_unuesed_fd():取回一个未被使用的文件描述符(每次都会选取最小的耒被使用位C件描述符)。filp_open():调用open_namei()函数取出和该文件相关的dentry和inode(因为前提指明了文件已经存在,所以dentry和inode能够查找到,不用创建),然后调用dentry_open()函数创建新的file对象,并用dentry和inode中的信息初始化file对象(文件当前的读写位置在file对象中保存)。注意到dentry_open()中有一条语句:f-f_op=fops_get(inode-

      6、i_fop);这个赋值语句把和具体文件系统相关的,操作文件的函数指针集合赋给了file对象的f_op变量(这个指针集合是保存在inode对象中的),在接下来的sys_read函数中将会调用file-f_op中的成员read。fd_install():以文件描述符为索引,关联当前进程描述符和上述的file对象,为之后的read和write等操作作准备。函数最后返回该文件描述符。图3显示了sys_open函数返回后,file对象和当前进程描述符之间的关联关系,以及file对象中操作文件的函数指针集合的来源(inode对象中白成员i_fop)。图3file对象和当前进程描述符之间的关系biiuciH心stmci:currentKtruci lask_sirve( JalDITlic_CDOLUltlfpinloclctfilelack:nlmasfdvintfdAci.ininextf(l;liIe*fd;用closeon巳xec;阻sirteopcn闻写:fdsenmenidsinit二stnict file struct file operations *f-struct inode s

      7、tmcifile*R_OPEN_DEFAULl;structflleoperacions*Tlfbp;仅需找行叶尊的珞住时津中描作的到此为止,所有的准备工作已经全部结束了,下面开始介绍read系统调用在图1所示的各个层次中的处理过程。虚拟文件系统层的处理:内核函数sys_read()是read系统调用在该层的入口点,清单2显示了该函数的代码。清单2sys_read函数的代码asmlinkagessize_tsys_read(unsignedintfd,char_user*buf,size_tcount)一一structfile*file;ssize_tret=-EBADF;intfput_needed;file=fget_light(fd,&fput_needed);if(file)loff_tpos=file_pos_read(file);ret=vfs_read(file,buf,count,&pos);file_pos_write(file,pos);fput_light(file,fput_needed);一一returnret;代码解析:fget_light():根据fd指定

      8、的索引,从当前进程描述符中取出相应的file对或(见图3)。如果没找到指定的file对象,则返回错误如果找到了指定的file对象:调用file_pos_read()函数取出此次读写文件的当前位置。调用vfs_read()执行文件读取操作,而这个函数最终调用file-()指向的函数,代莉如下:if(file-f_op-read)ret=file-f_op-read(file,buf,count,pos);调用file_pos_whte()更新文件的当前读写位置。调用fput_light()更新文件的引用计数。最后返回读取数据的字节数。到此,虚拟文件系统层所做的处理就完成了,控制权交给了ext2文件系统层。在解析ext2文件系统层的操作之前,先让我们看一下file对象中read指针来源。File对象中read函数指针的来源:从前面对sys_open内核函数的分析来看,file-f_op来自于inode-i_fop。那么inode-i_fop来自于哪里呢在初始化inode对象时赋予的。见清单3。清单3ext2_read_inode()函数部分代码voidext2_read_inode(str

      9、uctinode*inode)一一if(S_ISREG(inode-i_mode)inode-i_op=&ext2_file_inode_operations;inode-i_fop=&ext2_file_operations;if(test_opt(inode-i_sb,NOBH)inode-i_mapping-a_ops=&ext2_nobh_aops;elseinode-i_mapping-a_ops=&ext2_aops;一一一从代码中可以看出,如果该inode所关联的文件是普通文件,则将变量ext2_file_operations的地址赋予inode对象的i_fop成员。所以可以知道:inode-函数指针所指向的函数为ext2_file_operations变量的成员read所指向的函数。下面来看一下ext2_file_operations变量的初始化过程,如清单4。清单4ext2_file_operations的初始化structfile_operationsext2_file_operations=.llseek=generic_file_llseek,.read=generic_file_read,.write=generic_file_write,.aio_read=generic_file_aio_read,.aio_write=generic_file_aio_write,.ioctl=ext2_ioctl,.mmap=generic_file_mmap,.open=generic_

      《read系统调用流程》由会员M****1分享,可在线阅读,更多相关《read系统调用流程》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.