如何在低级别处理C文件I / O操作?

时间:2011-08-23 18:46:04

标签: c operating-system

扩展标题。我想知道操作系统如何处理像fwrite,fread,fopen和fclose这样的函数。

实际上是什么流?

很抱歉,如果我不够清楚的话。

BTW我使用的是GNU / Linux Ubuntu 11.04。

更好地解释我想要问的内容。

我想知道如何将写入HDD的文件读入内存,以后如何才能创建它们的句柄。是BIOS通过驱动程序执行此操作吗?

2 个答案:

答案 0 :(得分:8)

C库采用类似fopen的函数,并将其转换为正确的OS系统调用。在Linux上,它是POSIX open函数。您可以在具有man 2 open的Linux终端中查看此定义。在Windows上,调用将是CreateFile,您可以在MSDN文档中看到。在Windows NT上,该函数又是实际NT内核函数NtCreateFile的另一种转换。

C库中的流是存储在FILE结构中的信息的集合。这通常是操作系统对文件的概念,作为“缓冲区”分配的内存区域以及当前读写位置的“句柄”。

我刚注意到你用'assembly'标记了这一点。然后,您可能想知道真正的低级细节。 This seems like a good article.

现在你已经改变了问题,询问甚至更低的级别。好吧,一旦操作系统获得打开文件的命令,它就会将该命令传递给VFS(虚拟文件系统)。该操作系统查找文件名,包括所需的任何目录,并进行必要的访问检查。如果这是在RAM缓存中,则不需要磁盘访问。如果没有,VFS会向特定文件系统发送一个读取请求,该请求可能是EXT4。然后EXT4文件系统驱动程序将确定该目录所在的磁盘块。然后它将向磁盘设备驱动程序发送读取命令。

假设磁盘驱动程序是AHCI,它会将读取块的请求转换为一系列寄存器写入,这将设置DMA(直接内存访问)请求。 This looks like a good source for some details.

此时主板上的AHCI控制器接管。它将与硬盘控制器通信,以协作读取数据并写入DMA存储器位置。

当这种情况发生时,操作系统会暂停该过程,以便继续进行其他工作。硬件正在处理事情,CPU不需要注意。磁盘请求将花费许多毫秒,在此期间CPU可以运行数百万条指令。

当请求完成时,AHCI控制器将发送一个中断。其中一个系统CPU将接收中断,查看其IDT(中断描述符表)并跳转到该位置的机器代码:中断处理程序。

操作系统中断处理程序将读取一些数据,发现它已被AHCI控制器中断,然后它将跳转到AHCI驱动程序代码。 AHCI驱动程序将读取控制器上的寄存器,确定读取完成,将标记放入其操作队列,告诉OS调度程序它需要运行,然后返回。此时没有其他事情发生。

操作系统会注意到它需要运行AHCI驱动程序的队列。当它决定这样做(它可能正在运行实时任务或者可能正在读取网络数据包)时,它将从标记为DMA的内存块中读取数据并将该数据复制到EXT4文件系统驱动程序。那个EXT4驱动程序然后将数据返回到VFS,这将把它放入缓存。 VFS将返回open系统调用的操作系统文件句柄,该调用将返回到fopen库调用,该调用将把它放入FILE结构并返回指针那个程序。

答案 1 :(得分:0)

fopen等通常在特定于操作系统的系统调用之上实现。在Unix上,这意味着用于处理文件描述符的API:open,read,write,close和其他一些。在Windows上,它是CreateFile,ReadFile等。