本文转载自:https://blog.csdn.net/skyflying2012/article/details/9748133

系统调用本身是软中断,使用系统调用,内核也陷入内核态,异常处理,找到相应的入口最后就会跳转到sys_mount,跳转到sys_mount之前的这个过程主要是跟系统的异常处理相关,以mips处理器为例,相关代码在arch/mips/kernel/下的traps.c syscall32-o32.S等文件中实现的,过几天有空再缕一遍,今天主要总结的是sys_mount之后的事情,内核是如何实现将文件系统挂载的过程

sys_mount的实现在fs/namespace.c中,我查看了2个版本的内核2.6.21和2.6.36,发现在36内核下使用SYSCALL_DEFINE5来定义的系统调用,21下是直接定义的sys_mount函数,网上搜了一下这个宏定义的分析,是为了解决64位机器上使用32位系统调用的问题,这个宏定义在另一篇文章中我总结分析了一下,这里我就从sys_mount函数开始往下跟。

mount的实现过程在深入理解linux内核的虚拟文件系统一章中也有分析

1 sys_mount

sys_mount主要将系统调用的参数dev_name dir_name type flags data从用户空间拷贝到内核空间,然后调用do_mount函数

2 do_mount

调用kern_path来查找挂载点的路径名,之后会根据传递参数flags来决定如何挂载,我们按照最简单的挂载方式,就是挂载一个普通的磁盘分区来分析,这样会调用do_new_mount

3 do_new_mount

do_new_mount函数会先定义struct vfsmount结构体,这个结构体在内核中用来表示已挂载文件系统的一些信息,具体的结构体成员解释可以参考UTLK的485页

接着会lock_kernel获取内核锁,调用do_kern_mount函数,do_kern_mount函数的返回值就是struct vfsmount,参数name是挂载的设备文件,因此这个函数会根据要挂载的文件系统将这个结构体填充。

4 do_kern_mount

do_kern_mount函数首先会调用get_fs_type来查看内核是否注册了参数type所指的文件系统,对于内核源码下fs目录下的所有文件系统都会通过调用register_filesystem来注册这个文件系统,其实就是添加到内核文件系统链表中,get_fs_type会将参数type字符串跟内核链表中所有已经注册的文件系统结构体file_system_type的name成员向比较,如果找到,则说明内核已经注册了相应文件系统,并且返回相应文件系统注册的file_system_type结构体。后面的挂载过程需要使用到这个结构体中的成员。

找到相应的file_system_type后do_kern_mount会调用vfs_kern_mount,这个函数返回值是struct vfsmount

5 vfs_kern_mount

vfs_kern_mount首先调用alloc_vfsmnt为struct vfsmount分配内存空间,参数是要挂载的设备文件名称,在alloc_vfsmnt中会将name来填充vfsmnt结构体的mnt_devname成员,vfs_kern_mount才是真正去填充vfsmnt结构体的函数。

接着vfs_kern_mount会调用file_system_type参数中的get_sb成员函数,这个就是使用相应注册文件系统的get_sb函数来填充vfsmnt结构体的super_block结构体,get_sb在具体文件系统的实现中,如果自己写一个简单文件系统的话,实现get_sb算是最基本的一步,get_sb在具体的文件系统实现中会读取对应磁盘设备上的superblock将相应的信息填充到内存中的super_block对象中,并且建立起该文件系统根目录的目录项对象和inode节点对象,这样就建立了从vfsmnt到superblock到dentry到inode的一条索引。

调用get_sb填充完vfsmnt的super_block成员后在vfs_kern_mount中在将vfsmnt的其他一些记录成员进行初始化,成功返回

6 do_kern_mount

从vfs_kern_mount返回后,内核中代表挂载文件系统的vfsmnt结构体填充成功,后面主要是调用put_filesystem将对应文件系统模块使用量兼1.返回到do_new_mount

7  do_new_mount

从do_kern_mount返回后,vfsmnt结构体填充成功,do_new_mount调用unlock_kernel释放内核锁,最后调用do_add_mount将新挂载的文件系统(由vfsmnt表示)添加到系统的命名空间结构体的已挂载文件系统链表中,命名空间是指系统中以挂载文件系统树,每个进程的PCB中都有namespace成员来表示该进程的命名空间,大多数的进程共享同一个命名空间,所以如果在一个进程中将磁盘挂载到系统中,在另一个进程也是可以看到的,这就是由命名空间来实现的。vfsmnt添加到相应的namespace中的vfsmnt链表成功后do_new_mount返回

8 do_mount sys_mount

从do_new_mount返回后do_mount返回,最后sys_mount返回,这一块没有重要的知识了。

就这样从sys_mount到vfs_kern_mount到get_sb,然后再层层返回,内核也就实现了指定文件系统的磁盘挂载到指定目录。总体感觉在这个过程中内核主要实现vfsmnt结构体的填充,这个结构体中比较重要的是super_block的填充,然后将vfsmnt添加到相应进程PCB的namespace成员所指向的namespace结构体中,大部分进程都指向这个namespace,所以挂载对大部分进程可见。

上面的分析是按照最基本的挂载方式,复杂的方式以后在分析

linux系统调用mount全过程分析【转】的更多相关文章

  1. Linux 系统调用过程详细分析

    内核版本:Linux-4.19 操作系统通过系统调用为运行于其上的进程提供服务. 那么,在应用程序内,调用一个系统调用的流程是怎样的呢? 我们以一个假设的系统调用 xyz() 为例,介绍一次系统调用的 ...

  2. linux系统调用实现代码分析【转】

    转自:http://linux.chinaunix.net/doc/kernel/2001-07-30/637.shtml 启动早就读完,现在为了写笔记再从启动之后粗略的大体读一遍,基本就是几个大模块 ...

  3. Android/Linux下CGroup框架分析及其使用

    1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...

  4. linux内核剖析(六)Linux系统调用详解(实现机制分析)

    本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...

  5. 【转】linux文件系统之mount流程分析

    本质上,Ext3 mount的过程实际上是inode被替代的过程. 例如,/dev/sdb块设备被mount到/mnt/alan目录.命令:mount -t ext3 /dev/sdb /mnt/al ...

  6. Linux文件系统之Mount流程分析

    转载:原文地址http://www.linuxeye.com/linuxrumen/1121.html 本质上,Ext3 mount的过程实际上是inode被替代的过程.例如,/dev/sdb块设备被 ...

  7. Linux系统调用的实现机制分析

    API/POSIX/C库的关系        系统调用的实现 3.1    系统调用处理程序 添加新系统调用 给Linux添加一个新的系统调用是件相对容易的工作.怎样设计和实现一个系统调用是难题所在, ...

  8. Linux内核源代码情景分析系列

    http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统  5.1 概述 构成一个操作系统最重要的就 ...

  9. [Linux]Linux系统调用列表

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

随机推荐

  1. 【前端GUI】—— 前端设计稿切图通用性标准

    前言:公司在前端组和视觉组交接设计稿切图的时候,总会因为视觉组同事们对前端的实现原理不清楚而出现各种问题,在用的时候还得再次返工,前端组同事们一致觉得应该出一份<设计稿切图通用性标准文件> ...

  2. 线程安全的概念和Synchronized(读书笔记)

         并行程序开发的一大关注重点就是线程安全,一般来说,程序并行化为了获取更多的执行效率,但前提是,高效率不能以牺牲正确性为代价,线程安全就是并行程序的根本和根基.volatile并不能真正保证线 ...

  3. HDU 4927 大数

    题意非常easy: 对于长度为n的数.做n-1遍.生成的新数列: b1=a2-a1   b2=a3-a2  b3=a4-a3 c1=b2-b1   c2=b3-b2 ans=c2-c1 最后推出公式: ...

  4. 将VS2010里的红色波浪线去掉

    有时候,程序编译没错,却出现了一堆的红色波浪形,看着就烦. 解决方案:在VAssistX菜单栏->Visual Assist X Options->展开Advanced->Under ...

  5. 【基础算法】排序-复杂排序之二(找出第K大的数)

    切割的思想是高速排序最精髓的地方.每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点 1. 被切割出来的元素K最后一定排在第K位. 2. 在K左边的元素一定比K小或者相等. 3. ...

  6. OOA/OOD/OOP的区别

    http://javajiao.iteye.com/blog/152956这是一个故事: "工程師修了一條隧道,隧道的一端就是美麗的風景,很多人會開車通過隧道.雖然隧道內已經有燈了,但是設計 ...

  7. 时钟展频技术能有效降低EMI,深入讲解展频发生器!

    原文地址:https://baijiahao.baidu.com/s?id=1608649367453023659&wfr=spider&for=pc 相关文章: 1.http://b ...

  8. Spring学习四----------Bean的配置之Bean的配置项及作用域

    © 版权声明:本文为博主原创文章,转载请注明出处 Bean的作用域(每个作用域都是在同一个Bean容器中) 1.singleton:单例,指一个Bean容器中只存在一份(默认) 2.prototype ...

  9. 13 nginx gzip压缩提升网站速度

    一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding ...

  10. linux memcached php 整合

    http://blog.csdn.net/liruxing1715/article/details/8269563