【发布时间】:2019-09-06 02:49:01
【问题描述】:
在我看来,存储在辅助存储器(硬盘)中的所有内容都存储在文件中。因此,我将文件系统理解为关于文件的每个块的信息的系统化。(这反过来可能是关于 inode 信息的系统化)。
所以我想知道的是,当程序打算对文件进行操作时,在汇编和硬件级别会发生什么。我试着思考了一下,结果是这样的。
因此,如果我在第一段中写下的理解是正确的,那么任何需要一定字节数的读取操作,比如 X,都会将 X 除以块大小得到结果,比如 N,然后在文件系统中查询前 N 个块内容的位置,并获取存储在这些位置的内容。如果是硬盘,则从磁盘中获取内容。但是这种从磁盘读取是否涉及使用 DMA 并因此通过某些 DMA 控制器控制通信?
当读取所需的字节数时,它们是否将内容放入执行程序的堆栈中,其中一个变量将保存所需的字节数,或者因此获得的内容被放置在其他位置,例如堆?
对于写操作,我可以想到类似的机制,取偏移量,确定所需的块号,然后将要写入的新字节划分为块,并在文件系统中更新新块。
如果我以上理解有误,请指正。
但是,我想不出任何对关闭文件有重要意义的事情,也无法弄清楚不关闭文件在硬件和组装方面的不良影响。
我看过以下帖子:
http://www.brokenthorn.com/Resources/OSDev20.html
和
http://www.brokenthorn.com/Resources/OSDev20.html.
在这里,我可以在汇编中看到用于写入软盘设备或进行 DMA 的插图,但在以下章节中:
http://www.brokenthorn.com/Resources/OSDev22.html
这与文件系统有关,我无法准确找出文件操作的汇编级详细信息。 (虽然在前面的一些章节中,已经介绍了从 FAT 读取,但据我所知,它使用了 BIOS 中断)。
那么简而言之,在文件打开、文件读取、文件写入和文件关闭期间,硬件和程序集级别会发生什么?
【问题讨论】:
-
您是否正在尝试编写设备驱动程序?
-
@SomeName : 目前没有,只是想了解在文件 I/O 期间在程序集级别会发生什么
-
在文件打开过程中,系统使用给定的路径和文件名来定位和打开文件。在具有虚拟内存的典型系统上,对于使用 DMA 或总线主控的读/写操作,用户缓冲区被锁定并转换为一组物理页面,对于 X86 系统大小为 4KB,然后是一个“描述符”列表,其中包含创建物理地址和大小并用于读/写操作。在读或写之后,用户缓冲区被解锁。文件关闭将释放任何系统创建的缓冲区和任何与打开文件相关的分配内存。
-
然后在文件系统中查询前 N 个块的内容的位置,并获取存储在这些位置的内容。不完全是。在普通的现代操作系统中,内核的文件读取实现将首先检查该文件数据的那部分是否缓存在 RAM(页面缓存)中不关心它来自磁盘的哪个位置。仅当未命中时,VFS / 页面缓存才必须找出如何将数据放入内存中,然后将其复制到用户空间。进行
read系统调用的进程不知道这些,它只是做了例如rax=0/syscall(x86-64 Linux) -
在汇编级别发生的一切与在操作系统内核中实际实现文件访问的 C 代码中所表达的不同。有一小部分神奇的汇编代码实现了从进程代码到内核代码的转换,但除此之外,您无需考虑汇编级别发生的事情来了解它是如何工作的。
标签: file assembly filesystems