linux内核函数open源码,open()在Linux内核的实现(1)-基本实现
原标题:open()在Linux内核的实现(1)-基本实现
1.基本说明
在用户态使用open()时,必须向该函数传入文件路径和打开权限。这两个参数传入内核后,内核首先检查这个文件路径存在的合法性,同时还需检查使用者是否有合法权限打开该文件。如果一切顺利,那么内核将对访问该文件的进程创建一个file结构。
在用户态,通常open()在操作成功时返回的是一个非负整数,即所谓的文件描述符(fd,file deor);并且,用户态后续对文件的读写操作等都是通过fd来完成的。由此可见fd与file结构在内核中有一定的关联。
具体的,内核使用进程描述符task_struct来描述一个进程,而该进程所有已打开文件对应的file结构将形成一个数组files(其为files_struct结构),内核向用户返回的fd便是该数组中具体file结构的索引。默认情况下,每个进程创建后都已打开了标准输入文件、标准输出文件、标准错误文件,因此他们的文件描述符依次为0、1和2。
2.函数分析2.1.do_sys_open
明白了上述原理,那么open系统调用在内核中的基本实现过程就很清晰。根据系统调用入口函数的命名规则,open系统调用的入口函数应该为sys_open。不过,目前内核统一使用SYSCALL_DEFINEn宏来描述系统调用入口函数,因此可以在open.c文件中找到该入口函数,具体如下所示:
1
SYSCALL_DEFINE3(open,constchar__user *, filename,int, flags,int, mode);
该函数内部直接调用了do_sys_open函数,具体声明如下:
1
longdo_sys_open(intdfd,constchar__user *filename,intflags,intmode);
这个函数的参数基本上与open系统调用的参数一致。
该函数可以简单概括open系统调用的功能:
1.通过build_open_flags()将用户态的flags和mode转换成对应的内核态标志;
2.由于filename是用户态的内存缓冲区(使用了__user修饰),因此通过getname()将文件名从用户态拷贝至内核态;
3.get_unused_fd_flags()为即将打开的文件分配文件描述符;也就是在当前进程的files数组中寻找一个未使用的位置;
4.通过do_filp_open()为文件创建file结构体;
5.如果创建file成功,则通过fd_install()将fd和file进行关联;如果创建file失败,通过put_unused_fd()将已分配的fd返回至系统,并且根据file生成错误的fd;
6.通过putname()释放在内核分配的路径缓冲区;
7.返回fd;
当open系统调用执行完毕后,fd返回用户态,内核态新建了与其关联的file;对于每个进程而言,通过files_struct来记录其所打开的文件,具体通过fd_array数据保存fd和file的对应关系,fd本质为该数组的索引。
3.总结
至此,open的基本实现过程已经分析完毕。不过do_sys_open函数没有直接体现文件路径的查找过程,这部分将是整个open系统调用内核实现的重要部分。如果对此感兴趣,可以继续阅读本系列后续文章。
参考资料:
1.Linux源码3.2.69;
2.Linux系统调用open七日游:http://blog.chinaunix.net/uid-20522771-id-4419666.html
3.深入理解Linux内核:http://book.douban.com/subject/2287506/;
4.深入Linux内核架构:http://book.douban.com/subject/4843567/;
5.Linux内核探秘:http://book.douban.com/subject/25817503/;返回搜狐,查看更多
责任编辑:
linux内核函数open源码,open()在Linux内核的实现(1)-基本实现相关推荐
- linux开源显卡驱动源码,NVIDIA放弃Linux开源驱动 不支持GTX400显卡
来源: 驱动之家 作者: 陈晨 2010-03-30/09:35 NVIDIA对Linux操作系统下的开源显卡驱动一向热情不高,xf86-video-nv驱动一直仅能满足基本的2D图形渲染,几乎没有任 ...
- Linux系统中iotop源码安装,在Linux系统中安装iotop命令的方法
Linux中的iotop命令主要用于显示硬盘IO,但该命令只存在于kernelv2.6.20之后的版本, 那么要如何安装iotop命令呢?下面小编就给大家介绍下如何在Linux上安装iotop命令. ...
- 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )
文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...
- Linux 内核中RAID5源码详解之守护进程raid5d
Linux 内核中RAID5源码详解之守护进程raid5d 对于一个人,大脑支配着他的一举一动:对于一支部队,指挥中心控制着它的所有活动:同样,对于内核中的RAID5,也需要一个像大脑一样的东西来支配 ...
- fork的黑科技,它到底做了个啥,源码级分析linux内核的内存管理
最近一直在学习linux内核源码,总结一下 https://github.com/xiaozhang8tuo/linux-kernel-0.11 一份带注释的源码,学习用. fork的黑科技,它到底做 ...
- ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核
ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...
- Centos7 源码编译安装linux longterm 内核4.19.47
Centos7 源码编译安装linux longterm 内核4.19.47 首先去www.kernel.org下载新的内核,比如在我本次实际操作的时候 第4大版本的最新的longterm 版本为:4 ...
- 从Linux角度以及JVM源码,深入NIO的细节
原文地址:[网络编程]从Linux角度以及JVM源码,深入NIO的细节 最近一段时间都在啃Linux内核, 也给了自己机会再度深入理解Java的NIO实现,希望能获得更多东西,尝试理解以前未能理解的, ...
- tcpip四层源码分析(Linux)
tcp/ip四层源码分析(Linux)之socket.c 文章目录 tcp/ip四层源码分析(Linux)之socket.c 1.socket层 2.INET socket层 socket结构体解释 ...
最新文章
- ASSERT()是干什么用的
- 启动vm虚拟机里的系统时,提示此主机支持 AMD-V,但 AMD-V 处于禁用状态。
- php 多个单选怎么办,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
- test of duplicate control id
- Spring核心系列之ApplicationContext
- zkcli远程连接_高级框架第一天RPC:远程过程调用
- 光线追踪技术 清华大学 pdf_实时光线追踪技术:业界发展近况与未来挑战
- 【数据、软件共享】年鉴,夜间灯光,土地数据(永久更新)
- 计算一个文件下的所有视频总时长
- intel无线网卡日志服务器,不定期找不到Intel N 2230无线网卡
- 阿里巴巴矢量图标如何修改颜色,以及原理
- jmeter性能测试2-模拟多用户登录
- 陈如波律师:孙宇晨说自己“合法合规”站得住脚吗?
- php工具箱在win10自动退出,win10游戏闪退修复办法
- 有道云笔记linux使用教程,办公必备神器系列五:云笔记:为知笔记、印象笔记、有道云笔记...
- 质因数算法(C/C++)
- 窗口切换_Sinno_Song_新浪博客
- 针对HFS 2.3漏洞进行渗透测试提权(HFS:HttpFileServer)
- 亚马逊、沃尔玛自养号大额下单需要解决哪些问题?
- 【火影忍者】荏苒间,指针又在十字路口【转帖】
热门文章
- Spring MVC控制器的单元测试:REST API
- 在JBoss 7中使用HA Singleton
- 将原生SQL功能休眠到您的Spring Data Repository中
- JAXB自定义绑定– Java.util.Date / Spring 3序列化
- 错误学习:Java + OSGi
- 带有Jersey和Spring的RESTful Web应用程序
- Unix/Linux/BSD 它们之间的关系以及各自派系的介绍
- 服务中心Eureka
- dml语句包括哪些_聊聊MySQL基本操作DDL,DML,DQL,DCL
- 浙江科技学院c语言考试试卷,浙江科技学院c语言C试卷A.doc