主要观点:详细介绍了从调用write
系统调用开始,到字节最终被写入磁盘的整个过程,涉及到多个内核函数和数据结构的交互。
关键信息:
write
函数通过一系列操作将用户空间的字节参数重新打包为iovec
结构,然后调用dofilewritev
。dofilewritev
包含大量追踪和计数代码,实际工作是获取文件描述符对应的文件并进行实际的文件操作。- 后续经过
vn_write
、ffs_write
等函数,不断进行标志检查、地址转换等操作,最终将字节准备好进行写入。 - 字节进入缓冲区后,通过
bdwrite
等函数进行延迟写入或同步写入的处理,最终进入bwrite
函数。 - 在
bwrite
函数中,经过一系列操作后将字节准备好进行 DMA 传输,最终通过nvme_scsi_cmd
等函数将字节传递给 NVME 驱动进行实际的写入操作。
重要细节: - 涉及到多个内核文件和目录,如
kern/sys_generic.c
、kern/vfs_vnops.c
等,以及各种数据结构如struct sys_write_args
、struct vop_write_args
等。 - 中间过程包含大量的错误检查、标志设置和指针操作,如各种
if
判断、SET
和CLR
等操作。 - 不同函数之间通过函数指针和全局表进行交互,如
vops
表和bdevsw
表等。 - 写入过程涉及到多个层次的抽象和转换,从文件系统到磁盘驱动等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。