原标题:Linux完整性保护机制模块实现分析(1)
2 详细分析2.1 模块功能描述
文件系统完整性模块包含四种机制:监控磁盘机制、同步机制、检查修复文件系统机制、监视文件系统机制。
1.监控磁盘机制主要由statfs_by_dentry()、vfs_statfs()、user_statfs()、fd_statfs()、do_statfs_nativ()函数来支撑他们之间的关系,如下图:
图2-1:监控磁盘机制函数间调用图
图中sys_statfs()、sys_fstatfs()、sys_ustat()分别为监控磁盘机制的系统调用,它们调用函数的功能如下:
statfs_by_dentry:目录项在磁盘上的相关信息。
vfs_statfs():在虚拟文件系统的磁盘相关信息。
user_statfs():用户使用磁盘的相关信息。
fd_statfs():文件在磁盘上的相关信息。
do_statfs_native():获取磁盘的相关信息,并拷贝到用户态。
copy_to_user():将信息拷贝到指定的用户路径。
user_path_at():获得指定的用户路径。
user_path_put():释放指定的用户路径。
2.同步机制的主要支撑函数有:__sync_filesystem()、do_sync_work()、sync_one_sb()、sync_inode_sb()、writeback_inodes_sb()等。
图2-2:同步机制函数之间调用图
从图2-2可以看出无论是数据完整性同步还是刷出同步最后都要调用函数wb_writeback()来建立一个回写的工作。主要调用的函数功能如下:
emergency_sync():紧急同步,调用该函数后内存会立刻分配空间进行同步操作。
do_sync_work():进行了两次同步,以减少可能跳过的一些数据,因为有些数据可能被暂时锁定在inode/page中。
sys_sync():系统调用函数,完全同步即同步所有的数据,该操作会比较费时。
sync_filesystems():同步所有的数据和文件系统。
sync_one_sb():同步一个超级块并调用__sync_filesystem实现。
sys_syncfs():同步一个超级块。
sync_filesystem():写出并等待所有脏数据和对应的超级块,文件系统数据以及底层块设备并获得超级块锁。
__sync_filesystem():完成文件系统的同步工作,使文件系统的数据元素与磁盘上的文件系统同步。
sync_inode_sb():该函数回写并且等待对应超级块的所有脏inode。
writeback_inodes_sb():立即回写给定超级块对应的的脏inode,不进行等待操作。
writeback_inodes_sb_nr():回写给定超级块对应的脏inode。
wb_writeback():建立回写工作。
__writeback_single_inode():回写单个的inode。
write_inode():根据指定的inode地址进行回写操作。
3.文件系统监视机制在内核中的实现有:dnotify、inotify、fsnotify,它们都为用户提供了接口,但是具体的实现是由fsnotify框架来实现的,如图2-3所示:
图2-3:fsnotify的框架调用图
fsnotify_event():文件系统发生的具体的变化,比如文件的打开事件、读写事件、删除事件等等,在具体事件发生时创建该结构的实例。
fsnotify_mark():用户创建的文件系统监视,该结构实例是对文件或目录打做的一个标记,该文件或目录的某些变化将受到fsnotify机制的监视。监视实例以目录为组织单位管理,一个目录下的所有的文件监视实例的链表被嵌入该目录对应的索引节点结构中。
fsnotify_group():处理事件的策略,用户每创建一个对文件或目录的监视mark实例,必须指定一个fsnotify_group类型的实例group,在该文件发生用户关心的某些变化(即发生了某些event)时,将会调用fsnotify_group指定的事件处理函数进行处理。
责任编辑: