原标题: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)-基本实现相关推荐

  1. linux开源显卡驱动源码,NVIDIA放弃Linux开源驱动 不支持GTX400显卡

    来源: 驱动之家 作者: 陈晨 2010-03-30/09:35 NVIDIA对Linux操作系统下的开源显卡驱动一向热情不高,xf86-video-nv驱动一直仅能满足基本的2D图形渲染,几乎没有任 ...

  2. Linux系统中iotop源码安装,在Linux系统中安装iotop命令的方法

    Linux中的iotop命令主要用于显示硬盘IO,但该命令只存在于kernelv2.6.20之后的版本, 那么要如何安装iotop命令呢?下面小编就给大家介绍下如何在Linux上安装iotop命令. ...

  3. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  4. Linux 内核中RAID5源码详解之守护进程raid5d

    Linux 内核中RAID5源码详解之守护进程raid5d 对于一个人,大脑支配着他的一举一动:对于一支部队,指挥中心控制着它的所有活动:同样,对于内核中的RAID5,也需要一个像大脑一样的东西来支配 ...

  5. fork的黑科技,它到底做了个啥,源码级分析linux内核的内存管理

    最近一直在学习linux内核源码,总结一下 https://github.com/xiaozhang8tuo/linux-kernel-0.11 一份带注释的源码,学习用. fork的黑科技,它到底做 ...

  6. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核

    ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核 原以为会是很简单的事,结果还是颇废一番周折.很多情况是没有遇到过得.所以这里记录一下. 问题记录的 ...

  7. Centos7 源码编译安装linux longterm 内核4.19.47

    Centos7 源码编译安装linux longterm 内核4.19.47 首先去www.kernel.org下载新的内核,比如在我本次实际操作的时候 第4大版本的最新的longterm 版本为:4 ...

  8. 从Linux角度以及JVM源码,深入NIO的细节

    原文地址:[网络编程]从Linux角度以及JVM源码,深入NIO的细节 最近一段时间都在啃Linux内核, 也给了自己机会再度深入理解Java的NIO实现,希望能获得更多东西,尝试理解以前未能理解的, ...

  9. tcpip四层源码分析(Linux)

    tcp/ip四层源码分析(Linux)之socket.c 文章目录 tcp/ip四层源码分析(Linux)之socket.c 1.socket层 2.INET socket层 socket结构体解释 ...

最新文章

  1. ASSERT()是干什么用的
  2. 启动vm虚拟机里的系统时,提示此主机支持 AMD-V,但 AMD-V 处于禁用状态。
  3. php 多个单选怎么办,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
  4. test of duplicate control id
  5. Spring核心系列之ApplicationContext
  6. zkcli远程连接_高级框架第一天RPC:远程过程调用
  7. 光线追踪技术 清华大学 pdf_实时光线追踪技术:业界发展近况与未来挑战
  8. 【数据、软件共享】年鉴,夜间灯光,土地数据(永久更新)
  9. 计算一个文件下的所有视频总时长
  10. intel无线网卡日志服务器,不定期找不到Intel N 2230无线网卡
  11. 阿里巴巴矢量图标如何修改颜色,以及原理
  12. jmeter性能测试2-模拟多用户登录
  13. 陈如波律师:孙宇晨说自己“合法合规”站得住脚吗?
  14. php工具箱在win10自动退出,win10游戏闪退修复办法
  15. 有道云笔记linux使用教程,办公必备神器系列五:云笔记:为知笔记、印象笔记、有道云笔记...
  16. 质因数算法(C/C++)
  17. 窗口切换_Sinno_Song_新浪博客
  18. 针对HFS 2.3漏洞进行渗透测试提权(HFS:HttpFileServer)
  19. 亚马逊、沃尔玛自养号大额下单需要解决哪些问题?
  20. 【火影忍者】荏苒间,指针又在十字路口【转帖】

热门文章

  1. Spring MVC控制器的单元测试:REST API
  2. 在JBoss 7中使用HA Singleton
  3. 将原生SQL功能休眠到您的Spring Data Repository中
  4. JAXB自定义绑定– Java.util.Date / Spring 3序列化
  5. 错误学习:Java + OSGi
  6. 带有Jersey和Spring的RESTful Web应用程序
  7. Unix/Linux/BSD 它们之间的关系以及各自派系的介绍
  8. 服务中心Eureka
  9. dml语句包括哪些_聊聊MySQL基本操作DDL,DML,DQL,DCL
  10. 浙江科技学院c语言考试试卷,浙江科技学院c语言C试卷A.doc