本文转载自: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. 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_five.html 系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会 ...

  2. Cookie常用方法封装Utils

    1.查询某个指定的cookie package com.sun.etalk.cookie; import javax.servlet.http.Cookie; public class CookieU ...

  3. TensorFlow笔记五:将cifar10数据文件复原成图片格式

    cifar10数据集(http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz)源格式是数据文件,因为训练需要转换成图片格式 转换代码: 注意文件路 ...

  4. 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束

    引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...

  5. 2016.11.10 Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver

    运行项目rds_web时,出现错误提示:Could not get JDBC Connection; nested exception is java.sql.SQLException: No sui ...

  6. Struts2 convention插件试用+ Spring+Hibernate SSH整合

    第一步,引入struts2-convention-plugin-2.2.1.jar 然后,改动配置文件. 我是在struts.properties文件里改动的: struts.objectFactor ...

  7. linux 源代码安装mysql5.5

    linux下源代码安装mysql过程例如以下: yum update yum upgrade yum install -y vim man wget yum install -y gcc gcc-c+ ...

  8. CentOS开启FTP及配置用户

    vsftpd作为FTP服务器,在Linux系统中是非常常用的.下面我们介绍如何在centos系统上安装vsftp. 什么是vsftpd vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序 ...

  9. unbuntu16.04上python开发环境搭建建议

    unbuntu16.04上python开发环境搭建建议  2017-12-20  10:39:27 推荐列表: pycharm: 可以自行破解,但是不推荐,另外也不稳定 pydev+eclipse: ...

  10. java利用爬虫技术抓取(省、市(区号\邮编)、县)数据

    近期项目须要用到 城市的地址信息,但从网上下载的xml数据没有几个是最新的地址信息.....数据太老,导致有些地区不全.所以才想到天气预报官网特定有最新最全的数据.贴出代码,希望能给有相同困惑的朋友. ...