笔记 Linux文件系统的初始化

原创 2015年07月10日 12:09:49

uboot结束时调用start_kernel(/3.1.10/init/main.c)函数启动linux


start_kernel做内存初始化,操作系统数据结构初始化,调度系统初始化,各种资源初始化之后会调用vfs_caches_init初始化文件系统(/3.1.10/fs/dcache.c)


vfs_cache_init:

vfs_cache_init调用inode_init(/3.1.10/fs/inode.c)初始化inode数据结构,就是申请一大片内存,哈希表;

vfs_cache_init调用files_init(/3.1.10/fs/file_table.c)初始化文件句柄数据结构;

vfs_cache_init调用mnt_init(/3.1.10/fs/namespace.c)挂载根文件系统"/";

vfs_cache_init调用bdev_cache_init(/3.1.10/fs/block_dev.c)初始化块设备文件系统;

vfs_cache_init调用chrdev_init(/3.1.10/fs/char_dev.c)初始化字符设备文件系统。


mnt_init:

mnt_init调用sysfs_init(/3.1.10/fs/mount.c)注册"sysfs"类型的文件系统

    sysfs_init调用sysfs_inode_init(/3.1.10/fs/inode.c)

        sysfs_inode_init调用bdi_init(&sysfs_backing_dev_info)初始化backing_dev(???)

    sysfs_init调用register_filesystem(&sysfs_fs_type)(/3.1.10/fs/filesystem.c)注册类型为"sysfs"的文件系统

        register_filesystem将sysfs_fs_type添加到file_systems的全局链表中

    sysfs_init再调用kern_mount(/3.1.10/fs/namespace.c)将sysfs_fs_type绑定

        kern_mount_data调用vfs_kern_mount

            vfs_kern_mount调用alloc_vfsmnt分配一个mount的数据结构

                alloc_vfsmnt调用mnt_alloc_id分配一个mount id

                alloc_vfsmnt初始化mount数据结构中的各种链表,包括mnt_hash,mnt_child,mnt_mounts等等

            vfs_kern_mount调用mount_fs(/3.1.10/fs/super.c)绑定文件系统,得到一个dentry

                mount_fs调用file_system_type的mount回调函数执行绑定

                    这里进入sysfs_fs_type的回调也就是sysfs_mount函数

                    sysfs_mount分配私有数据

                    sysfs_mount调用sget来获取一个superblock

                        sget调用alloc_super分配superblock

                            alloc_super分配superblock结构

                            alloc_super初始化superblock的各种链表和互斥量

                        sget设置sb的私有数据

                        sget将sb的s_id设置为文件系统的名字

                        sget将sb添加到全局链表super_blocks中

                        sget将此sb添加到文件系统的自身的fs_supers链表中

                    sysfs_mount调用sysfs_fill_super设置sb的数据

                        sysfs_fill_super设置sb的操作为sysfs_ops

                        sysfs_fill_super调用sysfs_get_inode(&sysfs_root)分配一个inode(sysfs_root是预定义的sysfs_dirent类型全局变量,name为“”,ino为1)

                            sysfs_get_inode调用iget_locked

                                iget_locked调用find_inode_fast在sb的已分配的inode哈希表中查找指定ino的inode

                                如果找到,会调用wait_on_inode锁住该inode并返回

                                这里显然找不到, 

                                    所以调用alloc_inode分配inode

                                        alloc_inode分配inode节点

                                        alloc_inode调用inode_init_always初始化inode

                                            inode_init_always初始化inode,记录所属sb,初始inode的uid,gid,各种标志,默认操作等

                                    iget_locked添加本次查找到inode的哈希链表

                                    iget_locked添加sb到inode的sb链表

                                    iget_locked设置I_NEW标志并返回锁定状态下的inode

                            sysfs_getinode检测到返回的inode设置了I_NEW标志,调用sysfs_init_inode

                                sysfs_init_inode记录inode所对应的sysfs_dirent为inode的私有数据

                                sysfs_init_inode设置inode的inode操作为sysfs_inode_operations(包含权限检查,设置属性,读取属性等操作)

                                sysfs_init_inode检查到类型为DIR,重新设置inode的inode操作为sysfs_dir_inode_operations(包含查找,权限检查,设置属性,读取属性等操作)

                                sysfs_init_inode设置inode的文件操作为sysfs_dir_operations(包含读,读目录,释放,文件seek等操作)

                                sysfs_init_inode调用unlock_new_inode解锁inode,去掉I_NEW标志并返回

                        sysfs_fill_super调用d_alloc_root为inode分配一个根目录的dentry

                            d_alloc_root调用__d_alloc,参数中name为“/”,sb为inode的sb

                                __d_alloc分配dentry结构

                                __d_alloc存储dentry的名称

                                __d_alloc初始化dentry的各变量和列表,置操作函数为空

                                __d_alloc根据sb的操作函数设置dentry的Hash,比较,删除等标志

                           d_alloc_root调用d_instantiate填充dentry的inode信息

                                d_instantiate调用__d_instantiate将inode指针设置到dentry的d_inode中

                        sysfs_fill_super设置新建的dentry的d_fsdata为sysfs_root(包含根目录的目录标志,模式(权限属性),ino为1)

                        sysfs_fill_super设置新建的dentry为sb的根dentry(s_root)

                   sysfs_mount调用dget来锁定所获得的superblock的dentry并返回此dentry

            vfs_kern_mount将返回的dentry保存到mount结构的mnt_root中作为该文件系统的根节点,

            vfs_kern_mount记录mount点的sb为dentry的superblock,记录mount的mount_point为dentry,返回所创建的mount结构

        kern_mount_data调用mnt_make_longterm记录mount为长期不释放的

        kern_mount_data返回

    sysfs_init返回

mnt_init调用init_rootfs(/3.1.10/fs/ramfs/inode.c)注册"rootfs"文件系统

    init_rootfs调用bdi_init(&ramfs_backing_dev_info)添加一个backing_dev(ramfs_backing_dev_info中描述了ramfs文件系统的能力(如WRITEBACK等))

    inti_rootfs调用register_filesystem(&rootfs_fs_type)注册名称为"rootfs"的文件系统

mnt_init调用init_mount_tree(/3.1.10/fs/namespace.c)绑定“rootfs”文件系统并设置当前工作目录为rootfs的根目录

    init_mount_tree调用do_kern_mount绑定"rootfs"文件系统

        do_kern_mount先调用get_fs_type得到先前注册的rootfs文件系统

        do_kern_mount调用vfs_kern_mount绑定文件系统

            vfs_kern_mount调用alloc_vfsmnt分配mount数据

            vfs_kern_mount调用mount_fs绑定

                与前相同,mount_fs调用mount回调函数,这里进入rootfs_mount函数

                    rootfs_mount调用mount_nodev进行绑定

                        mount_nodev调用sget创建新的superbloack

                        mount_nodev调用fill_super填充新的sb,这里fill_super是回调函数,进入ramfs_fill_super

                            ramfs_fill_super调用ramfs_get_inode创建新的inode

                                ramfs_get_inode调用new_inode分配一个新的inode

                                ramfs_get_inode调用get_next_ino设置一个新的ino

                                由于有DIR标志,ramfs_get_inode设置inode的inode操作为ramfs_dir_inode_operations

                                由于有DIR标志,ramfs_get_inode设置inode的目录操作为simple_dir_operations

                            ramfs_fill_super调用d_alloc_root在inode上创建一个dentry(这里目录名为"/")

                            ramfs_fill_super设置superblock的根目录为新创建的dentry

                    rootfs_mount返回

            vfs_kern_mount将返回的dentry保存到mount结构的mnt_root中作为该文件系统的根节点,

            vfs_kern_mount记录mount点的sb为dentry的superblock,记录mount的mount_point为dentry,返回所创建的mount结构

        do_kern_mount调用put_filesystem解锁所绑定的文件系统并返回mount点

    init_mount_tree调用create_mnt_ns在绑定点上创建一个namespace

    init_mount_tree创建一个路径root,root的绑定点设置为刚创建的mount点,root的dentry设置为刚创建的mount点的根dentry

    init_mount_tree调用set_fs_pwd设置当前目录为路径root(即rootfs的根目录)(信息记录在当前task的fs数据中)

    init_mount_tree调用set_fs_root设置当前根目录为路径root(即rootfs的根目录)(信息记录在当前task的fs数据中)



linux文件系统初始化过程(1)---概述

linux文件系统主要分为三个部分:文件系统调用;虚拟文件系统(VFS);挂载到VFS的实际文件系统。 其中,VFS是核心,linux文件系统的本质就是在内存中创建一棵VFS树。当根目录被创建...
  • luomoweilan
  • luomoweilan
  • 2014年01月04日 21:30
  • 5221

一步一步粗谈linux文件系统(二)---------文件系统初始化

文件系统的初始化过程,两个大的过程 1、register_filesystem(structfile_system_type * fs) 2、struct vfsmount *kern_mount...
  • fenglifeng1987
  • fenglifeng1987
  • 2012年12月16日 21:44
  • 1041

套接口学习(一)实现

套接口这个概念最先由4.2BSD(1983)引入,现在已经成为一个通用的网络应用程序编程接口,受到所有操作系统的支持。套接口层位于应用程序和 协议栈之间,对应用程序屏蔽了与协议相关实现的具体细节。 ...
  • wangpeihuixyz
  • wangpeihuixyz
  • 2014年10月12日 12:29
  • 1255

Linux系统初始化流程

linux系统的启动,指的是从系统加电到系统控制台显示“login:”登录提示符为止的系统运行阶段,与这部分动作密切相关的代码主要是: 四个汇编程序:bootsect.S setup.S head...
  • viewsky11
  • viewsky11
  • 2016年11月04日 23:08
  • 485

Linux初始化init系统介绍

Linux初始化init系统最近把一个程序注册成为系统启动服务。发现Ubuntu16.04版本照比Ubuntu14.x版本不一样了 :-(。所以又去研究了一下Linux启动的问题。历史Linux 系统...
  • kriszhang
  • kriszhang
  • 2017年04月05日 01:12
  • 847

linux内核之系统初始化

linux内核的总体流程主要为: 系统上电后,先进行 (1)cpu自身的初始化 自身初始化后,cpu从某个固定位置取得指令执行,该指令为跳转指令,会跳转到bios指令的首部 (2)加电自检 这个是bi...
  • u012075739
  • u012075739
  • 2015年08月11日 22:49
  • 1033

linux文件系统初始化过程(5)---加载initrd(下)

linux把文件分为常规文件、目录文件、软链接文件、硬链接文件、特殊文件(设备文件、管道文件、socket文件等)几种类型,分别对应不同的新建函数sys_open()、sys_mkdir()、sys_...
  • luomoweilan
  • luomoweilan
  • 2014年02月09日 17:06
  • 3313

ext4 分配节点ext4_alloc_inode

/*  * Called inside transaction, so use GFP_NOFS  */ static struct inode *ext4_alloc_inode(struct...
  • sunlei0625
  • sunlei0625
  • 2018年01月05日 19:44
  • 17

Linux inode cache机制分析 (zt)

Linux inode cache机制分析 蓝森林 http://www.lslnet.com 2002年11月8日 16:24作 者: 詹荣开(詹荣开 zhanrk@sohu.com) Linux ...
  • wishfly
  • wishfly
  • 2005年02月04日 15:04
  • 3895

《Linux命令行与shell脚本》笔记--第7章:管理文件系统.md

7.1 探索Linux的文件系统7.1.1 基本的Linux文件系统 ext文件系统:扩展文件系统,Linux系统最早引入的系统。 使用虚拟目录来操作硬件设备,在物理设备上按定长的快来存储数据 采用...
  • z1106609486
  • z1106609486
  • 2016年06月06日 23:04
  • 356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔记 Linux文件系统的初始化
举报原因:
原因补充:

(最多只允许输入30个字)