对我而言,存储在辅助存储器(硬盘)中的所有内容都存储在文件中。因此,我将文件系统理解为关于文件的每个块的信息的系统化(这反过来又可能是关于inode的信息的系统化)。
所以我想知道的是,当程序打算对文件进行操作时,在汇编和硬件级别会发生什么。我试图考虑一下,并且遵循以下原则。
因此,如果我在第一段中写下的理解是正确的,那么任何需要一定字节数的读取操作(假设X)将X除以块大小即可得到结果,例如N,然后向文件系统查询前N个块内容的位置,并获取存储在这些位置中的内容。如果是硬盘,则从磁盘中提取内容。但是从磁盘读取数据是否涉及使用DMA,因此通信是通过某些DMA控制器控制的?
当读取了所需数量的字节后,它们是否将内容放置在执行的程序堆栈中,其中变量将保存所需数量的字节,或者因此将获得的内容放置在其他位置,例如,堆?
对于写操作,我可以想到类似的机制,在其中进行偏移量确定,确定所需的块编号,然后将要写入的新字节划分为块,并在文件系统中更新新的块。 / p>
如果我的上述理解有误,请更正。
但是,我没有想到对关闭文件有意义的任何事情,也无法弄清不关闭文件在硬件和汇编方面的不良影响。
我已经浏览了以下帖子:
http://www.brokenthorn.com/Resources/OSDev20.html
和
http://www.brokenthorn.com/Resources/OSDev20.html。
在这里,我可以在汇编中看到用于写入软盘设备或执行DMA的插图,但在下一章中:
http://www.brokenthorn.com/Resources/OSDev22.html
这是关于文件系统的,我无法确切地找到文件操作的汇编级别的详细信息。 (尽管在前面的一些章节中,已经讨论了从FAT中读取数据,但就我所知,它使用BIOS中断)。
因此,简而言之,在文件打开,文件读取,文件写入和文件关闭期间,在硬件和汇编级别发生了什么?
答案 0 :(得分:1)
文件操作在程序集级别是什么
在应用程序中,这是通过系统调用(例如x86 CPU上的int
指令)完成的。这样的系统调用将在OS中调用一个函数。
OS中的该函数通常是用汇编编写的简短函数,它调用通常用“高级”编程语言(通常为C;但是也可以用汇编编写此函数)编写的另一个函数。
第二个函数将调用许多其他函数。
在硬盘或软盘上,数据以扇区形式存储。每个扇区包含一定数量的字节(例如512),并且您只能读取或写入完整的扇区,而不能读取单个字节。磁盘对文件一无所知。
在典型的操作系统中,文件处理涉及两种不同类型的功能:
1)设备驱动程序功能
这些功能可用于从磁盘读取或向磁盘写入“扇区”数据。实际执行此操作取决于CPU和磁盘驱动器类型。
在最简单的情况下,您的CPU具有内存映射的I / O,并且既不使用中断也不使用DMA。具有历史意义的Commodore 1581软盘驱动器就是一个例子。
在这种情况下,软件只需将一个字节写入地址即可将某些数据写入硬件-与将字节写入RAM的方式相同。从硬件读取就像从RAM读取字节一样。
软件会将一些数据写入硬件,以指示磁盘驱动器从磁盘读取一些数据。然后,软件会连续从某个地址读取数据。此数据包含磁盘驱动器是否准备就绪的信息。磁盘驱动器准备就绪后,软件会通过从另一个地址读取数据来读取实际数据。写作也类似。
如果使用不使用内存映射I / O的CPU,则访问硬件不会像访问RAM那样工作,而是使用特殊指令(in
和out
)。 (较早的x86计算机就是一个例子。)
如果使用中断(如在现代计算机中一样),则该软件不需要连续检查磁盘驱动器是否已就绪。磁盘驱动器报告准备就绪后,CPU将立即调用一个特殊功能-所谓的“中断处理程序”。
如果使用DMA(如在现代计算机中一样),则磁盘驱动器可以直接将从磁盘读取的数据写入RAM(或从RAM读取要写入的数据)。因此,该软件仅需写入指示磁盘驱动器写入某些扇区的特殊数据。该软件不必写入应写入磁盘的实际数据,因为磁盘驱动器将直接从RAM中读取该数据。 (阅读也是如此。)
2)文件系统功能
这些功能将调用“设备驱动程序”功能来访问磁盘。
文件系统或多或少不过是一些描述文件如何存储在磁盘上的描述。如果磁盘使用“ FAT16”文件系统,则磁盘上有三个区域:FAT,根目录和群集。
(在使用“ inodes”的文件系统上,这有点不同;但是原理是相同的。)
FAT包含有关某些文件在磁盘上的存储位置以及哪些群集可用的信息。根目录包含有关磁盘上文件名称的信息(以及一些其他信息,例如文件大小)。并且群集包含实际的文件数据。
将文件写入磁盘时,文件系统功能将读取FAT的扇区(通过调用“设备驱动程序”的功能)。它将检查FAT的内容以查找免费群集。现在它将读取根目录,添加写入文件的文件名,并将根目录写回到磁盘。然后,这些函数会将文件的实际数据写入群集。最后,这些函数将更新FAT(相应的扇区不再可用)和根目录(文件大小不再为零)数据并将此信息写回到磁盘。