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 结构体并没有释放,释放是在内核态返回用户态才调用回调函数完成的;否则连接都不用断开,值减少引用计数
阅读(9720) | 评论(0) | 转发(1) |