linux 初始化文件失败,笔记 Linux文件系统的初始化

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值