VFS提供的文件操作接口如下:
struct file*filp_open(const char*filename,int flags,umode_t mode)
ssize_t vfs_read(struct file*,char__user*,size_t,loff_t*);
ssize_t vfs_write(struct file*,const char__user*,size_t,loff_t*);
int filp_close(struct file*filp,fl_owner_t id);
物理文件用inode表示,打开的文件用file表示。打开的文件在应用层标记为文件描述符(file descriptor)。应用层调用open,对应内核的open系统调用:
do_sys_open函数代码如下:
long do_sys_open(int dfd,const char__user*filename,int flags,umode_t mode)
do_sys_open函数最后会调用do_dentry_open函数,其中有对file结构的文件操作接口进行赋值:
(www.xing528.com)
这是file结构的文件操作接口的来源。图11-1为文件操作调用关系图。
图11-1 文件操作调用关系
例11.2 在内核中访问文件
代码见\samples\11block\11-2module_appfile。本例演示如何在内核中访问文件系统中的文件。核心代码如下:
vfs_write函数的第二个参数为来自用户空间的地址,但本例中的缓冲来自内核空间,所以需要使用set_fs函数来设置本线程的地址上限为KERNEL_DS,以允许vfs_write访问buffertmp。文件访问结束后需恢复原先的地址上限。本例运行结果如下:
[root@urbetter drivers]#insmod hello.ko
open fs.txt successfully
write buffertmp=1,len=1
read buffertmp=1
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。