在操作系统级别发生什么事情,想要将某些内容写入文件?

时间:2014-03-15 21:11:47

标签: c linux file-io operating-system

在操作系统级别想要将某些内容写入文件时会发生什么?任何操作系统都没问题但是我对Linux很熟悉,所以如果有人在Linux上给我答案那就太好了。

我知道在下面用C语言打开文件时会发生的一些事情是我的粗略代码。

FILE *fp;
fp = fopen("/tmp/test.txt", "w+");
fputs("This is testing for fputs...\n", fp);
  • C将调用库函数write()。
  • write()库函数将调用系统调用write()。
  • 将调用128个中断号,执行进入内核模式。
  • 将在eax寄存器中传递系统调用号。
  • 将在ebx,ecx等注册中传递写入调用的参数。
  • ???现在我想知道它将如何解决文件路径,如何写入文件,任何磁盘调度程序参与(Linus Elevator,预期调度程序,CFS调度程序等),任何DMA参与或任何其他如果我遗漏了什么?

1 个答案:

答案 0 :(得分:6)

接下来,调用sys_write内核函数。请下载Linux kernel来源的副本,并查看它。您正在SYSCALL_DEFINE3(write...中寻找fs/read_write.c

sys_write会调用fdget基本上获得struct file*指针,并调用vfs_write(在同一文件中)。

请记住,write是一个非常通用的系统调用,它允许您将数据写入任何打开的文件描述符(根本不是磁盘上的文件)。在struct file*中是指向许多函数指针的指针(f_op)。由于"文件"这是一个完全通用的东西,这些函数指针是知道如何进行实际编写的,具体取决于文件的类型。这提供了一种"多态性",但是在普通的C代码中。因此vfs_write会调用file->f_op->write()

这些调用将逐步进入文件系统层(在fs/目录中)。同样,这取决于您安装的文件系统(例如ext3nfs等)。

最终,它们将向下到块设备层,这是块数据到真实硬件的原始读/写操作完成的地方。同样,这取决于您连接的设备(例如PATA,SATA / SCSI,RAID,USB,网络......)

设备驱动程序是进行实际与硬件通信的地方。这是发生任何DMA或内存映射I / O的地方。

最好用good book来描述。