zl程序教程

您现在的位置是:首页 >  其他

当前栏目

lab5实验报告

2023-04-18 15:38:41 时间

lab5实验报告

一、实验思考题

Thinking5.1

/proc是一种由软件创建的特殊的伪文件系统,通过特殊的接口来访问内核。每一个文件对应于内核中的函数,其中大部分文件时只读的,但可以通过临时设置来改变内核的设置。用户在读取文件时,通过该函数可以动态生成文件的内容。

Windows分盘设计,驱动器之下有自己的根目录,通过提供系统调用接口来实现。

这种文件系统对系统调用进行了抽象,可以对用户隐藏更多细节,但缺点是需要长期装载在内存中,消耗空间。

Thinking5.2

内核存放于kseg0,一般需要通过cache访问,如果设备的写入缓存到cache中,外部设备更新后,已经缓存的部分没有被更新,可能导致之后的访问错误写入设备的内容。

Thinking5.3

最大块1024 * 4KB = 4MB

Thinking5.4

一个文件控制块256B,一个磁盘块4KB,一块最多存4KB / 256B = 16块。

一个目录最大为4MB,则最多4MB / 256B = 16K个文件。

Thinking5.5

kseg1区域来映射磁盘,最多处理1GB

Thinking5.6

结构体FIlefd中的第一个成员类型是struct Fd*,所以转化出来实际上是匹配的struct Filefdstruct Fd,转化后可以访问struct Filefd中的其他变量。

Thinking5.7

  • Fd结构体对应文件描述符
    • fd_dev_id对应设备id
    • fd_offset对应相对于文件开头的偏移量
    • fd_omode对应文件打开的模式

对文件进行读写和管理,做一些内存的记录,不对应物理实体。

  • Filefdfile + fd,文件与文件描述符的组合
    • file_fd是文件描述符
    • f_fileid记录文件id
    • f_file文件控制块

有记录文件信息和文件所在磁盘块的指针,对应于磁盘的物理实体,包含内存数据。

  • Open存储文件相关信息
    • o_file文件控制块
    • o_fileid文件再opentab数组中查找的有关索引值
    • o_mode记录文件打开模式
    • o_ff对应的Filefd结构体

Thinking5.8

这是一个后台进程,没有接收请求时就等待,接收到文件系统调用才继续执行,所以不会导致整个内核进入panic状态

二、实验难点图示

设备

设备部分主要有三种,调用syscall_write_devsyscall_read_dev

  • console范围0x10000000 - 0x20,控制台终端
  • IDE范围0x13000000 - 0x4200,磁盘
  • rtc范围0x15000000 - 0x200,时钟终端

文件系统结构

File结构

struct File {
	u_char f_name[MAXNAMELEN];
	u_int f_size;
	u_int f_type;
	u_int f_direct[NDIRECT];
	u_int f_indirect;

	struct File *f_dir;
	u_int f_printcount;
	u_int f_modifycount;
	u_char f_pad[BY2FILE - MAXNAMELEN - 4 - 4 - NDIRECT * 4 - 4 - 4 - 4 - 4];
};

磁盘块Block

struct Block {
    uint8_t data[BY2BLK];
    uint32_t type;
};

磁盘,存放Block的数组

struct Block {
    uint8_t data[BY2BLK];
    uint32_t type;
} disk[NBLOCK];

创建文件

create_file函数,需要分情况判断

  • 没有block正在使用,创建全新
  • 存在block且其中有一个空的文件控制块位置
  • 存在block但没有空的位置,创建新的

文件系统用户接口

系统调用IPC机制实现有相应的请求号

#define FSREQ_OPEN	1
#define FSREQ_MAP	2
#define FSREQ_SET_SIZE	3
#define FSREQ_CLOSE	4
#define FSREQ_DIRTY	5
#define FSREQ_REMOVE	6
#define FSREQ_SYNC	7

经过对应的处理之后,进入fsipc函数

三、体会与感想

文件系统部分关于磁盘的读写和设备驱动思考了比较久,在磁盘上需要先理解各个位置所对应的内容。磁盘由仿真设备Gxemul模拟器提供,指导书中有相关的提示。

物理地址转换为内核虚拟地址,调用read_sector函数。

位图bitmap用于标识磁盘中块的使用情况。

经过本次实验,对于文件系统有了进一步的了解,内存结构、IPC也很本次内容紧密相关,理清思路需要阅读大量代码,是一个很好的锻炼。