20191330雷清逸 学习笔记5

一、知识点归纳以及自己最有收获的内容

知识点归纳:

大纲:

本章讨论EXT2文件系统。本章将引导读者实现一个完全与Linux兼容的完整EXT2文件系统。前提是,只要读者充分理解了一个文件系统,那么就可以轻松改编其他任何文件系统。
本章首先描述了EXT2文件系统在Linux中的历史地位以及EXT3/EXT4文件系统的当前状况;
用编程示例展示了各种EXT2数据结构以及如何遍历EXT2文件系统树;介绍了如何实现支持Linux内核中所有文件操作的EXT2文件系统;
展示了如何通过虚拟磁盘的mount_root来构建基本文件系统;
将文件系统的实现划分为3个级别,级别1扩展了基本文件系统,以实现文件系统树,级别2实现了文件内容的读/写操作,级别3实现了文件系统的挂载/装載和文件保护;
描述了各个级别文件系统函数的算法,并通过编程示例演示了它 们的实现过程;
将所有级别融合到一个编程项目中;最后,将所有编程示例和练习整合到一个完全有效的文件系统中。

本章中重要知识点归纳:

超级块:
1.s_first_data_block: 0表示4KB块大小,1表示1KB块大小。它用于确定块组描述符的 起始块,即 s_first_data_block + 10
2.s_log_block_size :确定文件块大小,为 lKB*(2**s_log_block_size),例如:0 表示 1KB块大小,1表示2KB块大小,2表示4KB块大小等。最常用的块大小是用于小文件系 统的1KB和用于大文件系统的4KB。
3.s_mnt_count :已挂载文件系统的次数。当挂载计数达到max mnt count时,fsck会话 将被迫检查文件系统的一致性。
4.s_magic:文件系统类型的幻数。EXT2/3/4文件系统的幻数是0xEF53

索引节点:

u16 i_mode;		// 16 bits =|ttttlugs|rwx|rwx|rwxl
u16 i_uid;		// owmer uid 
u32 i_size;		// file size in bytes 
u32 i_atime;	//time fields in seconds
u32 i_ctime;	// since 00:00:00,1-1-1970
u32 i_mtime;
u32 _dtime;
u16 i_gid;		// group ID 
u16 i_links_count;// hard-link count
u32 i_blocks;	// number of 512-byte sectors 
u32 i_flags;	//IGNORE
u32 i_reservedl;// IGNORE
u32 i_block[15];// See details below 
u32 _pad[7];	// for inode size = 128 bytes
}

文件系统项目的扩展:
(1)多个组:组描述符的大小为32字节”对于1KB大小的块,一个块可能包含 1024/32 = 32组描述符。32个组的文件系统大小可以扩展为32*8 = 256MB.
(2)4KB大小的块:对于4KB大小的块和一个组,文件系统大小应为48 = 32MB。对于一个组描述符块,文件系统可能有128个组,可将文件系统大小扩展到12832 = 4GB。 对于2个组描述符块,文件系统大小为8GB等。大多数扩展都很简单,适合用于编程项目。
(3)管道文件:管道可实现为普通文件,这些文件遵循管道的读/写协议。此方案的优点是:它统一了管道和文件索引节点,并允许可被不相关进程使用的命名管道。为支持快速读/写操作,管道内容应在内存中,比如在RAMdisk中。必要时,读者可将命名管道实现为FIFO文件.
(4)I/O缓冲:在编程项目中,每个磁盘块都是直接读写的。这会产生过多的物理磁盘I/O操作。为提髙效率,实际文件系统通常使用一系列I/O缓冲区作为磁盘块的缓存内存。

posted @ 2021-10-17 21:11  20191330雷清逸  阅读(12)  评论(0编辑  收藏  举报