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

3 c operating-system

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

什么是实际的流?

对不起,如果我不够清楚.

顺便说一下,我使用的是GNU/Linux Ubuntu 11.04.

更好地解释我想要问的问题.

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

Zan*_*ynx 8

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

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

我刚注意到你用'assembly'标记了这一点.然后,您可能想知道真正的低级细节.这似乎是一篇好文章.

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

假设磁盘驱动程序是AHCI,它会将读取块的请求转换为一系列寄存器写入,这将设置DMA(直接内存访问)请求.这似乎是一些细节的好来源.

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

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

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

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

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