笔记 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 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
  • 3690

套接口学习(一)实现

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

一张图深度解析Linux共享内存的内核实现

本文首先介绍了众所周知的共享内存API,然后介绍了相关的内核主要数据结构,并逐一分析了shmget、shmat、数据访问、shmdt的内核实现及数据结构之间的动态关系,从数据的关联图即可一窥共享内存的...

linux设备:初始化

本文转载自http://blog.chinaunix.net/uid-24631445-id-3419097.html 不过本人在此将源码修改为3.14.3的源码了 当按下开机...
  • zhqh100
  • zhqh100
  • 2014年06月01日 22:31
  • 620

Linux系统初始化流程

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

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

linux把文件分为常规文件、目录文件、软链接文件、硬链接文件、特殊文件(设备文件、管道文件、socket文件等)几种类型,分别对应不同的新建函数sys_open()、sys_mkdir()、sys_...

Linux系统的文件系统详解

Linux系统文件系统: 1、文件系统介绍     文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识。     本文将站在一个较高的视图来了解linux的文件系统,主要包...

linux下的文件系统选型

贝壳原来一直认为文件系统可以随便选,结果最近吃了两次苦头。一个是btrfs对虚拟机支持不良,另一个是特定情况下xfs性能比ext3高20倍。痛定思痛,打算列一下文件系统选型的方法和依据,欢迎拍砖。 ...

多核心Linux内核路径优化的不二法门之-slab与伙伴系统

作为这个系列的第一篇,我先来描述一下slab系统。因为近些天有和同事,朋友讨论过这个主题,而且觉得这个主题还算比较典型,所以就作为第一篇了。其实按照操作系统理论来讲,进程管理应该更加重要些,按照我自己...
  • dog250
  • dog250
  • 2015年09月16日 05:08
  • 4698

《unix/linux编程实践教程》学习笔记:第四章 文件系统:编写pwd

文件系统的内部结构 Unix文件系统由三个部分组成: (1)超级块,存放文件系统本身的结构信息。 (2)inode表,每个文件都有一个inode,用来保存文件的属性,inode的位置被称为文件的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔记 Linux文件系统的初始化
举报原因:
原因补充:

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