首页 理论教育 操作系统实现之路-文件读取

操作系统实现之路-文件读取

时间:2023-10-21 理论教育 版权反馈
【摘要】:下面以文件读取为例,详细介绍这个过程。而ReadFile则需要考虑用户读取尺寸变化的情形,把任何尺寸的读取请求,转换为按照最大读取尺寸和块尺寸要求的读取操作。实际上,DeviceRead函数的大部分工作,是按照文件系统的规范,对文件进行操作。比如对FAT32来说,DeviceRead函数需要通过读取文件分配表,获得待读取内容所在的cluster号,然后调用DeviceReadSector函数,发起真正的读取操作。在读者对FAT32文件系统规范熟悉的情况下,代码很容易阅读。

操作系统实现之路-文件读取

文件打开之后,即可调用ReadFile、WriteFile等函数,对文件进行读写等操作了。下面以文件读取为例,详细介绍这个过程。写文件的过程与此类似,不再赘述。

首先看ReadFile函数的源代码,这个函数比CreateFile简单得多:

ReadFile的实现思路很简单,就是进一步调用文件系统驱动程序的DeviceRead函数。但复杂的地方在于,ReadFile需要做一下适配。设备驱动程序在实现的时候,可以设定一个最大读取尺寸和一个块尺寸。最大读取尺寸是一次DeviceRead调用能够读取的最大尺寸,而块尺寸则要求每次读取的时候,读取尺寸值必须是块尺寸的整数倍。这样可方便驱动程序的实现,比如针对文件来说,可以设置最大读取尺寸为16KB,块尺寸为4KB。这样在实现的时候,只需要有一个16KB的全局缓冲区和一个4KB的块缓冲区即可。无需考虑用户读取尺寸变化的情形。(www.xing528.com)

而ReadFile则需要考虑用户读取尺寸变化的情形,把任何尺寸的读取请求,转换为按照最大读取尺寸和块尺寸要求的读取操作。针对大于最大读取尺寸的情形,ReadFile需要分开多次进行读取。而如果读取的尺寸不是块尺寸的整数倍,ReadFile也要以块尺寸为单位调用DeviceRead函数,调用完成后,只复制相关的内容到用户缓冲区。

接下来就是文件驱动程序的工作了。文件驱动程序需要实现DeviceRead函数,完成对实际文件的读取。在实现的时候,必须遵循设备驱动程序实现规范。实际上,DeviceRead函数的大部分工作,是按照文件系统的规范,对文件进行操作。比如对FAT32来说,DeviceRead函数需要通过读取文件分配表,获得待读取内容所在的cluster号,然后调用DeviceReadSector函数,发起真正的读取操作。具体的实现过程比较复杂,在此就不详细陈述代码了。在读者对FAT32文件系统规范熟悉的情况下,代码很容易阅读。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈