如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Linux文件系统之文件的读写(续二)------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------八:VFS层的I/O操作VFS层是与用户界面直接交互的接口,在这一节里,我们将分为读写两部份来介绍VFS层的操作以及跟上层用用的交互.8.1:文件的读操作在用户空间,读文件操作的常用函数为read()。对应在系统空间的调用入口是sys_read().它的代码如下:asmlinkagessize_tsys_read(unsignedintfd,char__user*buf,size_tcount){structfile*file;ssize_tret=-EBADF;intfput_needed;//根据fd从进程中取出相应的file对象file=fget_light(fd,&fput_needed);if(file){loff_tpos=file_pos_read(file);//文件的当前位置ret=vfs_read(file,buf,count,&pos);//更新当前的文件位置file_pos_write(file,pos);fput_light(file,fput_needed);}returnret;}从进程中取得文件描述符后和文件当前的操作位置后会调用vfs_read()执行具体的操作过程.它的代码如下:ssize_tvfs_read(structfile*file,char__user*buf,size_tcount,loff_t*pos){structinode*inode=file->f_dentry->d_inode;ssize_tret;if(!(file->f_mode&FMODE_READ))return-EBADF;if(!file->f_op||(!file->f_op->read&&!file->f_op->aio_read))return-EINVAL;//检查当前区段是否允许读操作ret=locks_verify_area(FLOCK_VERIFY_READ,inode,file,*pos,count);if(!ret){//是否有权限ret=security_file_permission(file,MAY_READ);if(!ret){//如果有read操作,调用之if(file->f_op->read)ret=file->f_op->read(file,buf,count,pos);else//否则调用aio_readret=do_sync_read(file,buf,count,pos);//ret:写入的字节数if(ret>0)//产生通告dnotify_parent(file->f_dentry,DN_ACCESS);}}returnret;}从上面看到,会最终调用file的相关操作完成文件的读操作.曾记得我们在文件的打开一节中分析了文件的打开过程。在打开文件过程中,文件描述符的相关操作会被赋值为inode->f_op.对于ext2文件系统,inode的相关信息如下:inode->i_fop=&ext2_file_operations;structfile_operationsext2_file_operations={.llseek=generic_file_llseek,.read=generic_file_read,.write=generic_file_write,.aio_read=generic_file_aio_read,.aio_write=generic_file_aio_write,.ioctl=ext2_ioctl,.mmap=generic_file_mmap,.open=generic_file_open,.release=ext2_release_file,.fsync=ext2_sync_file,.readv=generic_file_readv,.writev=generic_file_writev,.sendfile=generic_file_sendfile,}相应文件读操作入口为generic_file_read():ssize_tgeneric_file_read(structfile*filp,char__user*buf,size_tcount,loff_t*ppos){//用户空间的