关闭

笔记 Linux文件系统的初始化

标签: linux
852人阅读 评论(0) 收藏 举报

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数据中)



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:40826次
    • 积分:438
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:10条
    最新评论