Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2326490
  • 博文数量: 145
  • 博客积分: 8668
  • 博客等级: 中将
  • 技术积分: 3922
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-09 21:21
个人简介

work hard

文章分类

全部博文(145)

文章存档

2016年(1)

2015年(1)

2014年(1)

2013年(12)

2012年(3)

2011年(9)

2010年(34)

2009年(55)

2008年(20)

2007年(9)

分类: LINUX

2008-11-26 16:21:38

本帖的主要内容提供一个从系统调用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
                            ||
                            \/
open = f->f_op->open;
open(inode, f);    --fs/open.c
/*以上两行代码分别完成了open系统调用时执行实际文件对应内核的open方法,即scull_open*/

阅读(2726) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

Godbach2009-12-26 15:14:10

open->sys_oepn->do_sys_open 从open到sys_open是系统调用产生了中断,查找到了系统调用表,open函数对应的系统调用表里面的就是sys_open函数

letmego1632009-12-26 10:37:45

int open(const char *pathname, int flags, mode_t mode); --系统调用 long do_sys_open(int dfd, const char __user *filename, int flags, int mode) --fs/open.c 这两函数在哪里连接上的,也就是说,open 在哪里 开始调用do_sys_open的?