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/;返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php禁止代理ip访问_php禁止某ip或ip地址段访问的方法

本文实例讲述了php禁止某ip或ip地址段访问的方法,分享给大家供大家参考。具体分析如下:因为还没有深入学习Apache和nginx 所以用PHP写了一个可以禁用地址的小程序使用时只需:即可禁用单个ip如下://禁用ip地址$ip$_SERVER["RE…

嵌入式linux图形系统设计,轻量级嵌入式Linux图形系统设计与实现

摘要:图形用户界面(GUI)是人机交互界面(MMI)的重要表现形式,它不仅提供了丰富的图像信息,而且提高了用户同嵌入式设备的交互效率。随着嵌入式技术的广泛应用和嵌入式硬件的快速发展,人们对嵌入式设备的需求日益增多,嵌入式图形用户界面的作用也越来越重要。 大多数嵌…

无服务器-构建现代应用程序的新方法

对无服务器/功能即服务/云功能技术感到好奇,但是还没有机会深入研究? 想知道所有的兴奋是什么? 无服务器并不意味着没有服务器。 这是构建现代应用程序的新方法。 观看此视频,以了解有关构建现代应用程序的这种新方法的更多信息。…

linux 查看其他磁盘分区,Linux 查看磁盘分区.pdf

Linux 查看磁盘分区作者:北南南北来自:LinuxSir.Org的,不仅仅是查看磁盘的分区表,而且也能进行磁盘分区的操作;但在本文,我们只讲磁盘分区的查看,以及分区的使用情况的查看;本文只是…

python 对象锁_也许你对 Python GIL 锁的理解是 错的。

摄影:产品经理甜白与草莓更配~我刚到现在这个公司时,听到当时一个高级工程师(现已离职)大声地跟他旁边的同事说:Python 有 GIL 锁,所以它的多线程实际上是单线程,所以写多线程代码不用考虑线程冲突,不用加…

linux下强制取消nfs挂载目录,强制卸载无响应的nfs挂载目录

强制卸载无响应的nfs挂载目录在日常的运维中, 经常有需要使用 nfs 挂载远程服务器目录的需求, 但是照我个人实际使用的经验来看, nfs 并不是"一劳永逸", 故障率还是蛮高的, 其中最长遇到的就是由于网络原因/远程 nfs 服务器原因或其他原因导致的 nfs 客户端与 nfs 服…

animals中文谐音_Animals谐音歌词,Maroon5《animals》英语歌曲中文音译

歌词谐音:Maroon 5《Animals(野性)》-音吧网英语歌曲谐音歌词中文音译原创词:本尼布兰克曲:亚当莱文,本尼布兰科,谢尔贝克,史奇雷克斯所属专辑:《冰雪奇缘》电影原声带音吧网-www.yinbawang.com…

服务性服务–服务到服务的通话

在上一篇文章中,我介绍了如何使用Knative的 Serving功能来运行示例Java应用程序。 这篇文章将介绍部署两个应用程序的步骤,其中一个应用程序调用另一个。 样品细节 整个示例可在我的github存储库中找到– https://github.com/bijukunjummen/sleuth-webf…

linux cookie 地址,SYN Cookie原理及其在Linux内核中的实现

在目前以IPv4为支撑的网络协议上搭建的网络环境中,SYN Flood是一种非常危险而常见的DoS攻击方式。到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最著名的一种。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明…

maya中英文对比_maya中英文对照表

1File文件New Scene建立新场景Open Scene打开场景Save Scene存盘场景Save Scene As改名存盘Import导入Export All导出所有Export Selection导出选定物体View Image查看图片View Sequence浏览顺序Create Reference引入场景文件Reference Editor引入场景编辑器Project项目New建立…

linux vmcore 分析,crash分析vmcore

然后进入 /var/crash/ 找到相应的vmcore执行crash 127.0.0.1-2014-01-21-23\:36\:14/vmcore /usr/lib/debug/lib/modules/2.6.32-902.279.9.1.***.el6.x86_64/vmlinux输出如下:KERNEL: /usr/lib/debug/lib/modules/2.6.32-902.279.9.1.***.el6.x86_64/vmlinuxDUM…

用置换破坏您的JUnit5测试

编写JUnit测试可能是一个乏味而乏味的过程。 了解如何使用排列结合TestFactory方法和DynamicTest对象以最少的编码工作来改进测试类。 在本文中,我将使用Java流ORM Speedment,因为它包含一个现成的Permutation类,从而帮助我节省了开发时间。…

es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法

【Object.keys()】ES5 引入了Object.keys()方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名var obj { foo: bar, baz: 42 };console.log(Object.keys(obj));// ["foo", "baz"]ES2017 引入了跟…

servlet异步_如何使用异步Servlet来提高性能

servlet异步这篇文章将描述一种性能优化技术,该技术适用于与现代Web应用程序相关的常见问题。 如今的应用程序不再只是被动地等待浏览器发起请求,而是希望自己开始通信。 一个典型的示例可能涉及聊天应用程序,拍卖行等–共同点是这样一个事实…

mysql锁机制 php_MySQL锁机制和PHP锁机制

模拟准备--如何模拟高并发访问一个脚本:apache安装文件的bin/ab.exe可以模拟并发量 -c 模拟多少并发量 -n 一共请求多少次 http://请求的脚本例如:cmd: apache安装路径/bin/ab.exe -c 10 -n 10 http://web.test.com/test.php【切入正题】MYSQ…

怎么安装红旗Linux5,如何用硬盘安装红旗LINUX5_0.doc

如何用硬盘安装红旗LINUX5_0如何用硬盘安装红旗LINUX5_0本文由xinbing9贡献红旗linux5.0安装教程相信大家都和我一样,在一开始知道linux的系统时充满了神秘感.习惯了windows的我们对另一种操作系统非常好奇.正是这种好奇心,我决定装linux.看看到底有什么东东.第一次装时,大略的…

企业应用程序开发框架的分类

如果您使用的是“最佳Java框架”,那么您很可能会迷失本文 ,它对Java Enterprise世界中的情况进行了很好的概述。 但是,从我的角度来看,它缺少一件非常重要的事情–对上述框架进行分类。 让我们看看这个生态系统的另一个角度&…

投资最重要的事读后感_《投资最重要的事》读书笔记分享

1、学习第二层次思维。在投资的零和世界中参与竞争之前,你必须先问问自己是否具有处于上半部分的充分理由。要想取得超过一般投资者的成绩,你必须有比群体共识更加深入的思考。你具备这样的能力吗?是什么让你认为自己具有这样的能力&#xff…

Linux下社交平台,Linux 启动

> 1. 如启动失败请 查看[坑点概述](https://doc.fastadmin.net/wanlshop/299.html)## Linux运行IM即时通讯#### 1\. 远程连接Linux可以通过远程连接软件、VNC远程连接、Workbench或宝塔面板 > 软件商店 > 宝塔SSH终端进入SSH 终端cd命令 进入cd www/wwwroot/你的网站/…

vscode 取消拉去变基_GIT快速回忆

关于GIT和github:请搜索git下载安装,安装了git才能去github或码云(国内)观察自己上传的代码,github有个桌面版只是基于git的的图形工具,还是需要下载git。概念:1.提交、版本、commit,ID,差不多都…