LDD3之scull--从open系统调用到scull_open函数调用流程分析

发布于 2022-09-22 14:38:31 字数 3584 浏览 13 评论 0

本帖的主要内容提供一个从系统调用open到内核中该文件实际的open方法的调用流程分析,基本上列出来从open系统调用到scull_open过程中调用的函数。
在这个过程中很多调用以及函数实现的细节还并不是很清楚。希望能够起到抛砖引玉的作用,大家一起交流,把这个调用流程丰富起来。

int open(const char *pathname, int flags, mode_t mode);  --系统调用
                            ||
                            \/
long sys_open(const char __user *filename, int flags, int mode)  -- fs/open.c
/*对应内核中的open接口函数*/
                            ||
                            \/
long do_sys_open(int dfd, const char __user *filename, int flags, int mode) --fs/open.c
/*用户空间的filename被拷贝到内核空间,获取当前可用的文件描述符*/
                            ||
                            \/
static struct file *do_filp_open(int dfd, const char *filename, int flags, int mode) --fs/open.c
                            ||
                            \/
int open_namei(int dfd, const char *pathname, int flag,
  int mode, struct nameidata *nd)
/*获取该文件对应的nameidata结构.该函数执行完毕,接着调用下面函数。这两个函数是顺序被do_filp_open调用*/
                            ||
                            \/
struct file *nameidata_to_filp(struct nameidata *nd, int flags) --fs/open.c
/*将nameidata 结构转换为打开的struct file结构*/
                            ||
                            \/
static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
     int flags, struct file *f,
     int (*open)(struct inode *, struct file *)) --fs/open.c
                            ||
                            \/
f->f_op = fops_get(inode->i_fop);  --fs/open.c
/*这里将系统调用中需要对应打开文件对应到内核中的file_operations结构体获取到,然后根据其函数
指针就可以找到该结构体中对该种文件操作的所有方法。scull对应的结构体是在scull_init的时候向内
核注册的。
                            ||
                            \/
open = f->f_op->open;
open(inode, f);    --fs/open.c
/*以上两行代码分别完成了open系统调用时执行实际文件对应内核的open方法,即scull_open

[ 本帖最后由 Godbach 于 2008-11-26 16:45 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

旧瑾黎汐 2022-09-29 14:38:31

这个流程非常清晰,学习了。

半世蒼涼 2022-09-29 14:38:31

原帖由 dreamice 于 2008-11-26 18:15 发表
这个流程非常清晰,学习了。

其实这只是个架子而已。我把函数调用流程列出来了,很多具体的东西都没有分析,主要是我的知识还不够深入啊。

等待大家来补充。

BTW,这个帖子给精华让我有点惭愧啊。

初吻给了烟 2022-09-29 14:38:31

原帖由 Godbach 于 2008-11-26 18:50 发表

其实这只是个架子而已。我把函数调用流程列出来了,很多具体的东西都没有分析,主要是我的知识还不够深入啊。

等待大家来补充。

BTW,这个帖子给精华让我有点惭愧啊。

搭个清晰架子,这个可以帮助很多人深入学习。而这个搭架子的能力,也是很多人所欠缺的。

沉睡月亮 2022-09-29 14:38:31

原帖由 dreamice 于 2008-11-26 21:33 发表

搭个清晰架子,这个可以帮助很多人深入学习。而这个搭架子的能力,也是很多人所欠缺的。

希望能够逐渐的把这个架子给完善了。中间涉及到很多细节问题啊

南笙 2022-09-29 14:38:31

原帖由 Godbach 于 2008-11-26 22:23 发表

希望能够逐渐的把这个架子给完善了。中间涉及到很多细节问题啊

希望后期,Godbach 兄能把这个完整的分析总结出来供大家分享,呵呵

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文