现在的Linux存储栈结构比较复杂,按照逻辑功能可以划分为如下几部分内容,如表7-1所示。
表7-1 Linux存储栈模块及其功能
续表
我们以向已有文件写入内容命令“echo test>/root/test.txt”为例,介绍写文件的简单过程(具体可参考《Understanding the Linux Kernel 3rd edition》第16章相关内容)。(www.xing528.com)
这条命令的写操作(即C语言中的open()、sprintf()、close()等函数,会带有偏移量和同步标志等)经过libc进入内核空间后,会使用系统调用函数write(),然后这个系统调用依次实现这几个主要过程:初始化临时变量(包含用户空间buffer的地址信息等);在VFS中确定文件“/root/test.txt”所在的inode(index node,索引节点)并加上信号锁;根据临时变量中的buffer信息更新内存页(page);调用具体文件系统驱动将内存页内容写入文件系统块,此时会从VFS中找到存储设备节点(比如/dev/sda)完成具体的硬盘驱动(比如hd、ahci、ata_piix等)函数调用,从而向硬盘扇区中写入之前存入page cache中的内容“test”;所有操作完成以后释放信号锁并告知用户空间写过程已完成。
以上过程中的相关元素可参考图7-1。
图7-1 Linux存储栈简图
page cache、I/O调度、同步标志等,它们作为Linux存储栈中的重要部分甚至比具体文件系统更能影响存储的性能。由于篇幅所限,笔者仅就其中的VFS、文件系统、块设备驱动予以介绍,对它们具体实现有兴趣的读者可以参考相关内核源码与书籍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。