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 Filefd
和struct Fd
,转化后可以访问struct Filefd
中的其他变量。
Thinking5.7
Fd
结构体对应文件描述符fd_dev_id
对应设备id
fd_offset
对应相对于文件开头的偏移量fd_omode
对应文件打开的模式
对文件进行读写和管理,做一些内存的记录,不对应物理实体。
Filefd
是file + fd
,文件与文件描述符的组合file_fd
是文件描述符f_fileid
记录文件id
f_file
文件控制块
有记录文件信息和文件所在磁盘块的指针,对应于磁盘的物理实体,包含内存数据。
Open
存储文件相关信息o_file
文件控制块o_fileid
文件再opentab
数组中查找的有关索引值o_mode
记录文件打开模式o_ff
对应的Filefd
结构体
Thinking5.8
这是一个后台进程,没有接收请求时就等待,接收到文件系统调用才继续执行,所以不会导致整个内核进入panic
状态
二、实验难点图示
设备
设备部分主要有三种,调用syscall_write_dev
和syscall_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
也很本次内容紧密相关,理清思路需要阅读大量代码,是一个很好的锻炼。