Ming's Blog

Back

操作系统真象还原笔记——文件系统Blur image

文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区 sector,每个扇区存储 512 字节。操作系统一次性读取一个块 blockblock 由多个扇区组成,一般大小为 4KB,是文件存取的最小单位。

linux中把文件信息和文件数据分开存放,一个文件对应一个 inodeinode 用于存储文件相关信息,其数量在格式化时就已确定,所有的 inode 通过 inode_table 数组来存储,同时minios使用位图来管理 inode

至于文件名则与目录项相关联,目录本身也是一种文件,一个目录的目录项中包含对应文件的文件名,inode 编号,文件类型等信息。

用户通过文件名检索:

  1. 首先会检索到对应的目录项
  2. 通过目录项找到对应 inode 编号。
  3. 通过编号访问 inode_table 获得 inode
  4. 通过 inode 存储的地址访问文件数据块。

文件系统结构

超级块

超级块存储了整个文件系统的信息。

__attribute__ ((packed)) 取消结构体内内存对齐,保证其在一个 block 内。

inode

这里只实现一级间接指针。

/* inode结构 */
struct inode {
   uint32_t i_no;    // inode编号

/* 当此inode是文件时,i_size是指文件大小,
若此inode是目录,i_size是指该目录下所有目录项大小之和*/
   uint32_t i_size;

   uint32_t i_open_cnts;   // 记录此文件被打开的次数
   bool write_deny;	   // 写文件不能并行,进程写文件前检查此标识

/* i_sectors[0-11]是直接块, i_sectors[12]用来存储一级间接块指针 */
   uint32_t i_sectors[13];
   struct list_elem inode_tag;
};
c

目录及目录项

#define MAX_FILE_NAME_LEN  16	 // 最大文件名长度

/* 目录结构 */
struct dir {
   struct inode* inode;
   uint32_t dir_pos;	  // 记录在目录内的偏移
   uint8_t dir_buf[512];  // 目录的数据缓存
};

/* 目录项结构 */
struct dir_entry {
   char filename[MAX_FILE_NAME_LEN];  // 普通文件或目录名称
   uint32_t i_no;		      // 普通文件或目录对应的inode编号
   enum file_types f_type;	      // 文件类型
};
c

创建文件系统

格式化分区

文件系统初始化

挂载文件系统

挂载文件系统实质是把文件系统的信息载入内存,在内存中监视硬盘信息,有写操作发生时再把改动写入到硬盘里。

  1. 函数 mount_partitionlist_traversal 的回调函数,其接受两个参数,pelemlist_traversal 传给它的列表中的元素,在此处 pelem 是分区 partition 中的 part_tag 的地址。arg 是待比对的参数,此处是分区名。函数功能是在分区链表中找到名为 part_name 的分区,并将其指针赋值给cur part——用来记录默认操作的分区。
  2. mount_partition 中用 sys_malloc 分别分配内存给 super_blockblock_bitmapinode_bitmap 并在位图中记录长度,再用 ide_read 分别读入数据,最后初始化打开的 inode 链表。

硬盘读写

文件操作

文件描述符

文件结构用于描述文件被打开后文件读写偏移量等信息,每个文件可以被多次打开,因此每个 inode 可以对应多个文件结构(在进程结构体中限制了打开文件的数目)。linux把所有文件结构放在一起,用一个数组——文件表来管理。

linux通过文件描述符寻找对应数据块的过程分为三步:

  1. 用文件描述符在PCB文件描述符数组中获取文件结构的下标。
  2. 用该下标在文件表中索引文件结构,获取对应 inode
  3. inodeinode 队列中不存在,linux会把 inode 从硬盘中把它加载到 inode 队列,并使文件结构中的 fd_inode 指向它。

inode操作基础

文件操作基础

路径解析与文件搜索

目录操作基础

文件创建,打开与写入

创建

打开

写入

目录创建与读取

loading

操作系统真象还原笔记——文件系统
https://astro-pure.js.org/blog/eleos-filesystem
Author Ming
Published at February 27, 2024
Comment seems to stuck. Try to refresh?✨