... | @@ -44,4 +44,86 @@ int sys_mount() |
... | @@ -44,4 +44,86 @@ int sys_mount() |
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
``` |
|
```
|
|
\ No newline at end of file |
|
|
|
|
|
这段代码实现了一个函数 `sys_mount()`,用于挂载 FAT32 文件系统。下面是对代码的逐步解释:
|
|
|
|
|
|
|
|
### 1. 函数头部与声明
|
|
|
|
|
|
|
|
```c
|
|
|
|
int sys_mount()
|
|
|
|
```
|
|
|
|
- `sys_mount()` 是一个返回整数值的函数,通常返回 0 表示成功,-1 表示失败。
|
|
|
|
|
|
|
|
### 2. 读取引导分区数据
|
|
|
|
|
|
|
|
```c
|
|
|
|
uint32_t N = fat32_read_N();
|
|
|
|
struct fat_boot_sector *boot_sector_data = fat32_read_boot_sector(N);
|
|
|
|
if (boot_sector_data == NULL)
|
|
|
|
{
|
|
|
|
// 处理错误
|
|
|
|
fprintf(stderr, "Failed to read boot sector.\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
- `fat32_read_N()` 读取引导分区编号或引导扇区的某些数据(假设是必要的数据读取操作)。
|
|
|
|
- `fat32_read_boot_sector(N)` 读取引导扇区数据并返回一个指向 `fat_boot_sector` 结构体的指针。
|
|
|
|
- 如果读取失败(`boot_sector_data` 为 `NULL`),则打印错误信息并返回 -1 表示失败。
|
|
|
|
|
|
|
|
### 3. 从引导分区读取 BPB(BIOS 参数块)
|
|
|
|
|
|
|
|
```c
|
|
|
|
struct fat_bios_param_block *bpb = fat32_read_bpb(boot_sector_data);
|
|
|
|
if (bpb == NULL)
|
|
|
|
{
|
|
|
|
// 处理错误
|
|
|
|
fprintf(stderr, "Failed to read BPB.\n");
|
|
|
|
free(boot_sector_data);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
- `fat32_read_bpb(boot_sector_data)` 从引导扇区数据中读取 BIOS 参数块 (BPB) 并返回一个指向 `fat_bios_param_block` 结构体的指针。
|
|
|
|
- 如果读取失败(`bpb` 为 `NULL`),则打印错误信息、释放先前分配的引导扇区数据内存,并返回 -1 表示失败。
|
|
|
|
|
|
|
|
### 4. 将 FAT(文件分配表)读入内存
|
|
|
|
|
|
|
|
```c
|
|
|
|
uint32_t *fat = fat32_read_fat(bpb, file_allocation_table);
|
|
|
|
if (fat == NULL)
|
|
|
|
{
|
|
|
|
// 处理错误
|
|
|
|
fprintf(stderr, "Failed to read FAT.\n");
|
|
|
|
free(boot_sector_data);
|
|
|
|
free(bpb);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
- `fat32_read_fat(bpb, file_allocation_table)` 根据 BPB 读取文件分配表 (FAT) 并返回一个指向 FAT 的指针。
|
|
|
|
- 如果读取失败(`fat` 为 `NULL`),则打印错误信息、释放先前分配的内存(引导扇区数据和 BPB),并返回 -1 表示失败。
|
|
|
|
|
|
|
|
### 5. 将根目录读入内存
|
|
|
|
|
|
|
|
```c
|
|
|
|
fat32_read_root_dir(fat, bpb);
|
|
|
|
```
|
|
|
|
- `fat32_read_root_dir(fat, bpb)` 根据 FAT 和 BPB 读取根目录到内存中。此函数没有返回值,因此假设它能够成功执行或在内部处理错误。
|
|
|
|
|
|
|
|
### 6. 清理分配的内存
|
|
|
|
|
|
|
|
```c
|
|
|
|
free(boot_sector_data);
|
|
|
|
free(bpb);
|
|
|
|
free(fat);
|
|
|
|
```
|
|
|
|
- 挂载操作完成后,释放之前分配的内存,以避免内存泄漏。
|
|
|
|
|
|
|
|
### 7. 返回成功状态
|
|
|
|
|
|
|
|
```c
|
|
|
|
return 0;
|
|
|
|
```
|
|
|
|
- 如果整个操作成功,返回 0 表示挂载成功。
|
|
|
|
|
|
|
|
### 总结
|
|
|
|
这个函数执行了一系列操作来挂载 FAT32 文件系统。主要步骤包括读取引导扇区数据、读取 BPB、将 FAT 读入内存、读取根目录并将其读入内存。整个过程中,有错误处理逻辑来应对每个关键步骤的失败,并在失败时释放已分配的内存资源。 |
|
|
|
\ No newline at end of file |