博文

目前显示的是 八月, 2011的博文

如何挂载一个文件系统

图片
挂载一个文件系统中最重要的数据结构有以下3个: 1.          file_system_type 要挂载的文件系统类型。 2.          super_block其中有怎样获取该文件系统相关数据的方法。 3.          vfsmount 这个数据结构起到被挂载文件系统和挂载点文件系统的枢纽所用 这几个数据结构的关系,请着重看下图的红色椭圆形区域:     对照上图,我们可以得出结论,如果要挂载一个文件系统需要做的工作: 1.查找相应的文件系统类型,such as ext2 ext3 or ntfs or yaffs2 or rootfs etc. 2.查找相应的挂载点,方法:一路摸索,顺藤摸瓜。找到其dentry和inode. 3.生成一个vfsmount,这个数据结构是挂载点目录以及正在挂载的这个文件系统的根目录(依据的数据结构是:mnt_mountpoing和mnt_root)的枢纽(非常重要),并将这个vfsmount放在到hashtable中。这个hashtable的hash值运算依据的是挂载点目录以及挂载点inode.除了挂载到hashtable中外,还要链到父挂载点的子链表中。 放在hashtable的原因是,将来在lookup其内的目录或者文件时,需要根据挂载点的目录和挂载点的inode取hash值快速得到vfsmount。 4.主要的工作完成后,还需要把正在挂载的这个文件系统的根目录的inode和dentry取出来放在内存中,其中dentry的值还要赋给vfsmount的mnt_root. 当然这个第4步骤和第3步骤可能会有混合,主要是为了给vfsmount->mnt_root赋值,所以,需要取该文件系统的根目录。   按照以上的分析,我们对照review一下内核的源码的流程(为了方便,将与分析无关的语句去掉了): 2393 SYSCALL_DEFINE5(mount, char __user *...

page cache\swap cache\buffer cache

page cache是与文件映射对应的,而swap cache是与匿名页对应的。如果一个内存页面不是文件映射,则在换入换出的时候加入到swap cache,如果是文件映射,则不需要交换缓冲。 这两个相同的就是都是address_space,都有相对应的文件操作。一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述。 struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构。 page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的。 一般情况下用户进程调用mmap()时,只是在进程空间内新增了一块相应大小的缓冲区,并设置了相应的访问标识,但并没有建立进程空间到物理页面的映射。因此,第一次访问该空间时,会引发一个缺页异常。 对于共享内存映射情况,缺页异常处理程序首先在swap cache中寻找目标页(符合address_space以及偏移量的物理页),如果找到,则直接返回地址;如果没有找到,则判断该页是否在交换区 (swap area),如果在,则执行一个换入操作;如果上述两种情况都不满足,处理程序将分配新的物理页面,并把它插入到page cache中。进程最终将更新进程页表。 注:对于映射普通文件情况(非共享映射),缺页异常处理程序首先会在page cache中根据address_space以及数据偏移量寻找相应的页面。如果没有找到,则说明文件数据还没有读入内存,处理程序会从磁盘读入相应的页面,并返回相应地址,同时,进程页表也会更新。 说到page cache我们很容易就与buffer cache混淆,在这里我需要说的是page cache是VFS的一部分,buffer cache是块设备驱动的一部分,或者说page cache是面向用户IO的cache,buffer cache是面向块设备IO的cache,page cache按照文件的逻辑页进行缓冲,buffer cache按照文件的物理块进行缓冲。page cache与buffer cache并不相互独立而是相互融合的,同一文件的cache页即可存在于page cache中,又可存在于buffer cache中,它们在物理内...