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

esw*_*aat 3 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);
Run Code Online (Sandbox Code Playgroud)
  • C将调用库函数write().
  • write()库函数将调用系统调用write().
  • 将调用128个中断号,执行进入内核模式.
  • 将在eax寄存器中传递系统调用号.
  • 将在ebx,ecx等寄存器中传递写入调用的参数.
  • ??? 现在我想知道它将如何解决文件路径,如何写入文件,任何磁盘调度程序参与(Linus Elevator,预期调度程序,CFS调度程序等),任何DMA参与或任何其他如果我遗漏了什么?

Jon*_*art 6

接下来,sys_write调用内核函数.去下载Linux内核源代码的副本,并查看它.您正在寻找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/目录中).如此反复,这取决于您所安装的是什么文件系统(例如ext3,nfs等)

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

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

本书可能最好用一本好书来描述.