open调用过程

1. 首先传到vfs的do_sys_open,在open.c中。

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

此时,我们只知道open传递过来的一些参数,比如filename,open调用是这样的

     int open(const char *pathname, int flags, mode_t mode);

 因此,只有dfd是新加的,我们先不管他的作用。

do_sys_open主要做以下事情

(1) int fd = build_open_flags(flags, mode, &op);//将open传递过来的flags和mode进行整理,赋值给op

   fd = get_unused_fd_flags(flags);//分配一个未使用的fd

    这个fd就是返回给用户open函数的fd。

(2) tmp = getname(filename); 将文件名做整理,并填充给tmp结构//struct filename *tmp;

(3) struct file *f = do_filp_open(dfd, tmp, &op); 这个就是实际的打开函数,填充struct file

(4) fd_install(fd, f); 将fd与 f进行关联。

2. 上面第(3)步是核心内容。首先我们在这里看struct file结构,/include/linux/fs.h

里面有三个比较重要的域。

	struct inode		*f_inode;	/* cached value */
	const struct file_operations	*f_op;
	struct address_space	*f_mapping;

我们看do_filp_open如何对他们进行填充。

(1)首先创建struct nameidata nd; set_nameidata(&nd, dfd, pathname);  struct nameidata 含有域struct path root; struct inode *inode; struct inode *link_inode;等。set_nameidata主要使用参数 pathname 。

struct task_struct首先使用局部指针指向当前进程的nameidata, struct nameidata *old = current->nameidata; 也即是说,每个进程结构包含一个nameidata

然后只是给nd的total_link_count和pathname赋值。inode并没有管。total_link_count据说是用来防止循环死链的。

(2) filp = path_openat(&nd, op, flags | LOOKUP_RCU);

首先是file = get_empty_filp(); 为struct file 分配内存。

(3)主要的打开操作在 do_last 中。

link_path_walk 用于一级一级解析文件路径,每一级都调用do_last。 参考:http://alanwu.blog.51cto.com/3652632/1120652

时间: 2024-08-01 09:41:55

open调用过程的相关文章

Servlet的调用过程_生命周期_继承结构

Servlet调用过程 浏览器上输入网站,dns解析域名成服务器的IP地址,浏览器带着一个请求行,和众多request请求头,找服务器. 1.分析请求的是哪台虚拟主机,查看Host请求头,如果没有Host请求头就访问缺省虚拟主机 2.分析访问的是当前虚拟主机中的哪个web资源,从请求行中分析出当前访问哪个web应用的资源 3.查找web.xml,查看有没有对应的虚拟路径 Servlet的生命周期 1.Servlet在第一次被访问到的时候,服务器创建出Servlet对象. 2.创建出对象之后,立即

.net ADF 中 Ajax 的调用过程.

图示是 .net ADF Ajax调用过程的简略过程: 1,2)当页面初始化之后, 浏览器一旦触发回调事件, 脚本函数负责处理回调信息, 并调用 ASP.NET 2.0/3.5 中的 WebForm_DoCallBack 函数, 将回调请求返回服务器. 其实质是利用 Microsoft.XMLHTTP 组件创建一个新的 HTTPRequest 对象,并将客户端请求异步发送回服务器. 3)客户端回调请求到达后,服务器初始化并调用继承ICallbackEventHandler接口的ADF组件或者Pa

Android学习Scroller(五)——详解Scroller调用过程以及View的重绘

MainActivity如下: package cc.ww; import android.os.Bundle; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.app.Activity;

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent.onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent.ViewGroup调用onTo

使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

http://bbs.pediy.com/showthread.php?p=1354999 标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程.作 者: shayi时 间: 2015-02-12,05:19:54链 接: http://bbs.pediy.com/showthread.php?t=197829 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. (本文同步更

c++中六种构造函数的实现以及9中情况下,构造函数的调用过程

六种构造函数的实现代码如下: #include<iostream> using namespace std; //c++中六种默认的构造函数 class Test { public: Test(int d = 0):m_data(d)//1构造函数(带默认值0),以参数列表的形式初始化 { cout<<"Creat Test Obj :"<<this<<endl; } ~Test()//2析构函数 { cout<<"

函数的调用过程(栈帧)

1.什么是栈帧? 栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构.C语言中,每个栈帧对应着一个未运行完的函数.从逻辑上讲,栈帧就是一个函数执行的环境:函数调用框架.函数参数.函数的局部变量.函数执行完后返回到哪里等等.栈是从高地址向低地址延伸的.每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息.寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址). 2.Add()函数的调用过程 我们以Add()函数为例深入的研究一

Android Java 与 C++ 调用过程中的常量,路径名、文件名、后缀名最大长度

/**************************************************************************** **************************************************************************** *** ***   This header was automatically generated from a Linux kernel header ***   of the same

Hbase的WAL在RegionServer基本调用过程

版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/221 来源:腾云阁 https://www.qcloud.com/community Hbase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群.本文档用于说明hbase的wal简单原理以及从源码的角度分析一个"写"请求是如何到达wal,wal又会做哪些请求.

堆栈桢的生成原理(调试器是如何生成堆栈的调用过程的)

一直比较好奇,调试器是如何生成堆栈的调用过程的,比如如下代码: int add(int a, int b){    return a + b;} int main(){    int c = add(1, 2);    system("pause"); return 0;} 调用Add时的堆栈截图如下: 调试器究竟是如何生成这个堆栈过程的呢? 我最初的理解调试器是根据EBP来生成该堆栈的,原理如下:可以看到按照上面的原理, 每次EBP里存放的都是当前函数的堆栈桢基址,所以我们只要一直递