Linux VFS中sys_open,sys_read,sys_readv,sys_write,sys_writev关系 2 http://blog.chinaunix.net/uid-2836

http://blog.chinaunix.net/uid-28362602-id-3426625.html                    分类: LINUX

1.sys_read(v),sys_write(v),sys_open调用先后问题
 
    sys_read(v),sys_write(v)调用之前,如果之前没有调用过sys_open,那么用户空间一定会想办法调用sys_open来建立进程task_struct,struct file,以及分配一个文件描述符三者之间的关系
    sys_read(v),sys_write(v)本身不会去建立文件描述符到struct file的联系(所以需要先调用sys_open来建立),它直接通过文件描述符去索引这个struct file结构体,以保证sys_read(v),sys_write(v)能够通过文件描述符直接找到对应的struct file结构体
 
2.具体文件系统(如ext3)必须实现VFS中的函数指针file->file_operation->read,file->file_operation->aio_read两者之中的至少一个
 
3.具体文件系统(如ext3)必须实现VFS中的函数指针file->file_operation->write,file->file_operation->aio_write两者之中的至少一个
 
4.sys_read优先调用file->file_operation->read
 
     file->file_operation在sys_open系统调用中被赋值为inode->file_operation,file_operation->read这个函数实现有具体的文件系统来实现,如ext3文件系统实现了这个函数
    之所以说优先调用是因为文件系统可以不实现这个函数(因为如2,3中所说,只需至少实现一个即可),那么最终调用file->file_operation->aio_read,但长度参数为1
    sys_write原理基本同sys_read
 
5.sys_readv优先调用file->file_operation->aio_read
 
    同4.file->file_operation在sys_open系统调用中被赋值为inode->file_operation,file_operation->aio_read这个函数实现有具体的文件系统来实现,如ext3文件系统实现了这个函数
    之所以说优先调用是因为文件系统可以不实现这个函数(因为如2,3中所说,只需至少实现一个即可),如果具体文件系统没有实现这个函数,则循环 readv()中长度参数 次file->file_operation->read来实现
    sys_writev原理基本同sys_readv
 
6.如果具体文件系统(如ext3)2,3中所说两种函数都实现了,那么sys_read调用file->file_operation->read(但实际调用的还是do_sync_read,do_sync_write,即最终还是调用长度为1的file_operation->aio_readv),sys_readv调用file->file_operation->aio_readv
   sys_write,sys_writev同理
 
7.无论是调用sys_read(v),还是sys_write(v),过程中如果读或写入操作没有完成则显式调用进程调度函数,本进程可能被挂起来且进程状态为TASK_UNINTERRUPTIBLE。直到最终读或写入完成,读或写成功后进程状态会变为TASK_RUNNING(读操作读取到的数据会放在用户空间的buf内存区,写操作buf内存区的内容已经写入成功)
 
8.我们常用的ext3文件系统,file_operations->read(v),file_operations->write(v)都实现了,所以用户空间read,readv(或者write,writev)分别调用的是不同的函数来完成,(当然,7中所说任何具体文件系统都成立)
 
 9.每次sys_open系统调用都会分配一个struct file结构体和一个本进程没有使用的文件描述符并且建立两者的关联。并且在内存中会建立这个文件的dentry,inode,vfsmount,以及各级父目录的dentry,inode,vfsmount
     如你访问“/usr/bin/make”,那么“usr” ,"bin",“make”三者的dentry,inode,vfsmount都会建立
 
10.sys_read(v),sys_write(v)在结束之后,如果没有别的进程在使用对应的struct file,dentry,vfsmount,那么本进程会去从其超级块的文件链表中断开连接,但是struct file 结构体并没有释放,释放是在内核态返回用户态才调用回调函数完成的;否则连接都不用断开,值减少引用计数
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sys_readvfs_read都是用于读取文件的函数,但它们在实现方式和使用场景上有一些区别。 sys_read是内核的系统调用,用于从文件描述符所指向的文件读取数据。它的原型定义在unistd.h头文件,函数签名为: ```c ssize_t sys_read(unsigned int fd, char __user *buf, size_t count); ``` 其,fd是文件描述符,buf是用户空间的缓冲区,count是要读取的字节数。sys_read函数将从文件读取count字节的数据,存储到buf,并返回实际读取的字节数。它是一种底层的读取文件数据的方法,通常在用户空间程序通过系统调用接口进行调用。 vfs_read是Linux内核虚拟文件系统(VFS)层提供的读取文件的函数。它是对底层文件系统的统一抽象,为不同类型的文件系统提供了统一的接口。vfs_read函数的原型定义在linux/fs.h头文件,函数签名为: ```c ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos); ``` 其,file是表示打开的文件的结构体指针,buf是用户空间的缓冲区,count是要读取的字节数,pos是文件的当前位置。vfs_read函数会从file所指向的文件读取count字节的数据到buf,并返回实际读取的字节数。它是在内核通过VFS层进行文件读取的方法,提供了更高层次的抽象和扩展性。 总结来说,sys_read是用户空间程序通过系统调用接口直接调用的底层读取文件数据的函数,而vfs_read是内核虚拟文件系统层提供的统一文件读取接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值