首页 理论教育 Linux驱动开发实例VFS文件接口

Linux驱动开发实例VFS文件接口

时间:2023-10-19 理论教育 版权反馈
【摘要】:VFS提供的文件操作接口如下:struct file*filp_openssize_t vfs_read;ssize_t vfs_write;int filp_close;物理文件用inode表示,打开的文件用file表示。应用层调用open,对应内核的open系统调用:do_sys_open函数代码如下:long do_sys_opendo_sys_open函数最后会调用do_dentry_open函数,其中有对file结构的文件操作接口进行赋值:这是file结构的文件操作接口的来源。图11-1为文件操作调用关系图。文件访问结束后需恢复原先的地址上限。本例运行结果如下:[root@urbetter drivers]#insmod hello.koopen fs.txt successfullywrite buffertmp=1,len=1read buffertmp=1

Linux驱动开发实例VFS文件接口

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系统调用:

978-7-111-56706-6-Chapter11-28.jpg

do_sys_open函数代码如下:

long do_sys_open(int dfd,const char__user*filename,int flags,umode_t mode)

978-7-111-56706-6-Chapter11-29.jpg

do_sys_open函数最后会调用do_dentry_open函数,其中有对file结构的文件操作接口进行赋值

978-7-111-56706-6-Chapter11-30.jpg(www.xing528.com)

这是file结构的文件操作接口的来源。图11-1为文件操作调用关系图。

978-7-111-56706-6-Chapter11-31.jpg

图11-1 文件操作调用关系

例11.2 在内核中访问文件

代码见\samples\11block\11-2module_appfile。本例演示如何在内核中访问文件系统中的文件。核心代码如下:

978-7-111-56706-6-Chapter11-32.jpg

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈