VFS中的read/write系统调用
VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。VFS是所有文件系统的抽象。
linux内核对每个文件读写操作都必须使用一个指针,指向要访问的具体文件系统的适当函数。换句话说,当应用程序对read()或是write()调用引起内核调用相应的sys_read()或是sys_write()服务例程,文件在内核内存中是由一个file数据结构来表示的。这种数据结构中包含一个称为f_op的字段,该字段中包含一个指向专对某一个文件系统(如sysfs虚拟文件系统)的读写函数指针,sys_read()或是sys_write()查找到指向该函数的指针,并调用它。这样一来,应用程序的read()或是write()就被转化为相对间接的调用:
file->f_op->read() 或 file->f_op->write()
或者 file->f_op->aio_write()
剖析printf函数
下面我们以printf
函数的调用为例,说明该函数是如何一步一步最终落在内核函数上去的。
write函数内部就是调用了int
中断。一般的系统调用都是调用0x80号中断。而操作系统中一般不会的显式的写出write的实现代码,而是通过_syscall3
宏展开的实现。
_syscall3
是专门用来处理有3个参数的系统调用的函数的实现。
同理还有