
OS操作系统实验:FAT12文件系统的实现(附报告和源码)
5星
- 浏览量: 0
- 大小:None
- 文件类型:MD
简介:
本项目通过实践探索了OS操作系统中FAT12文件系统的工作原理,并提供了详细的实验报告和完整源代码供学习参考。
### 操作系统实验——实现FAT12文件系统的功能及技术细节
#### 1. FAT12 文件系统的概述
FAT12 是一种早期的文件系统格式,主要用于存储空间较小的设备(如软盘)。其主要特点在于使用了 12 位簇号来表示文件分配表中的链表。由于每个簇号占用 12 位,因此最多可以支持 (2^{12} - 2 = 4094)个簇(减去两个用于标记未使用的和坏的簇)。这意味着在每簇大小为512字节的情况下,该文件系统最大可以支持大约 2MB 的存储空间。
#### 2. 实现的功能及技术细节
- **打印当前目录下所有文件和目录名**
- **实现思路**:利用标准库函数 `opendir` 和 `readdir`。`opendir` 函数用于打开一个目录流,若成功则返回非空的 DIR 结构体指针;而 `readdir` 则用来读取该目录中的每一个条目。
- **伪代码**:
```c
void ls(const char *path) {
DIR *d;
struct dirent *dir;
d = opendir(path);
if (d == NULL) {
perror(opendir);
return;
}
printf(内容如下:\n);
while ((dir = readdir(d)) != NULL) {
if (strcmp(dir->d_name, .) == 0 || strcmp(dir->d_name, ..) == 0)
continue;
printf(%s\n, dir->d_name);
}
closedir(d);
}
```
- **技术细节**:避免打印 `.` 和 `..` 这两个特殊目录,因为它们分别代表当前目录和父目录,在列出目录内容时通常被忽略。
- **打印文件目录的文件控制块**
- **实现思路**:读取磁盘上的文件控制块(FCB)信息。这些信息包含了关于每个文件的基本属性。
- **伪代码**:
```c
void print_FCB(struct root_dir_entry *root_dir, const char *disk, int offset, int root_ent_cnt) {
int fd = open(disk, O_RDONLY);
if (fd < 0) {
perror(无法打开磁盘文件);
return;
}
for (offset; offset <= offset + 32 * (root_ent_cnt - 1); offset += 32) {
pread(fd, root_dir, sizeof(struct root_dir_entry), offset);
if (root_dir->name[0] == 0xE5)
continue;
if (root_dir->name[0] == 0x00)
break;
printf(名称:);
for (int i = 0; i < 8; i++)
printf(%c, root_dir->name[i]);
printf(\n扩展名:);
// 打印扩展名
printf(\n属性:);
for (int i = 7; i >= 0; i--) {
if ((root_dir->attributes & (1 << i)) != 0)
printf(%d, 1);
else
printf(%d, 0);
}
printf(\n);
// 其他字段的打印
}
close(fd);
}
```
- **技术细节**:文件控制块中的属性字段通常采用位标志表示不同的属性,例如只读、隐藏等。通过位操作来获取各个属性。
- **打印整个文件分配表**
- **实现思路**:遍历文件分配表的每一项,并输出每个簇的状态。
- **技术细节**:FAT12 文件系统中的每个簇号使用 12 位表示,需要正确读取和解释这些数据。
- **切换目录**
- **实现思路**:通过改变当前工作目录来模拟 `cd` 命令的功能。
- **技术细节**:可以使用 `chdir` 函数更改当前工作目录。需要注意权限问题。
- **创建文件、删除文件**
- **实现思路**:利用系统调用 `open` 和 `unlink` 来实现。
- **技术细节**:通过 `open` 创建新文件,通过 `unlink` 删除已存在的文件。
- **创建目录、删除目录**
- **实现思路**:使用 `mkdir` 和 `rmdir` 函数来操作。
- **技术细节**:用 `mkdir` 来创建目录。而只能删除空的目录,若要移除非空目录,则需要先清空该目录中的所有文件和子目录。
#### 3. 测试
全部评论 (0)


