一、知识点归纳以及自己最有收获的内容
知识点归纳:
大纲:
本章讨论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缓冲区作为磁盘块的缓存内存。