[dEw] 简单文件系统设计笔记

来源:互联网 发布:iphone制作视频软件 编辑:程序博客网 时间:2024/05/22 05:47

QDFS - Quick & Dirty File System

注意:此设计仅供测试

此文件系统只是一个最小化实现,没有作出任何优化或者安全性优化。在之后此文档将继续更新以优化或改善安全性。

你可以在 dist/hosttools/edhd 中找到磁盘镜像编辑可执行文件.
可执行文件构建平台为 openSUSE 42.1 x86_64. 如果需要自行编译文件,源码可在 src/hosttools/edhd.c 处找到. 请用host模式编译!


概念

+--------------------+|     主硬盘引导记录   |+--------------------+|       记录区块      | -> 不使用分区 +--------------------+|       数据区块      |\____________________/记录格式0              15     19   23         27        31 (Byte)+---------------+------+----+----------+---------+|名字           |偏移量 |大小|文件属性    |时间戳    |+---------------+------+----+----------+---------+|<---- 016 ---->|<-04->|<04>|<-- 04 -->|<-- 4 -->| (Byte)文件属性结构0          7    11   14       15+----------+-----+----+--------+|权限       |所有 |类型|扩展标志位|+----------+-----+-------------+|<-- 08 -->|<-4->|<---- 4 ---->| (bit)权限0          7+----------+|rwx|rwx|rw| 分别属于:所有者、所有组、其他人(其他人总无执行权限)+----------+
struct record{    char name[16];    uint32_t offset;    uint32_t size;    uint32_t attribute;    uint32_t timestamp;};

记录区块的大小不固定。为了之后的读写操作方便,建议预先留1024个条目(包括
空记录和扩展记录),或者预留5%剩余磁盘空间。

首条记录为空记录。空记录用于记录记录区块的属性,其名称必须为 #REC_TBL,
其偏移量必须为 0, 其大小即为记录区块大小,其权限必须为 11011011(0xDB),
其时间戳必须为 0.

文件操作之前,必须先检查空记录的权限。当发生异常时(如记录互相冲突或记录
互相重叠),程序必须放弃文件操作,空记录权限会被置为 10010010(0x92). 硬
盘进入只读模式,直到用户运行磁盘检查程序修复冲突。

当记录区块空间用尽时,使最后一条记录指向硬盘中的一个文件作为记录区块。最后
一条记录即为扩展记录。扩展记录的权限应该设为 11111111(0xFF), 类型为 3.

出于性能考虑应尽量避免使用扩展记录。如果操作系统中实现了磁盘清理工具,应该
在磁盘清理时扩充记录表并合并扩展记录内容。

文件的物理地址由此公式计算: 记录区块大小 + 偏移量 * 4字节. 即每个文件都对齐到
4字节处。

文件的逻辑大小由 size 属性给出。当扩展位为 1 时,文件的逻辑大小为 size 属性
的4倍。此操作可能会导致实际文件大小小于逻辑文件大小。

文件夹的属性 type1. 其偏移量指向硬盘中一个4KB的文件,文件中存放在文件夹内
的文件的偏移量。

链接的属性 type2. 其偏移量指向链接对象,大小为 0.

特殊文件的属性 type3. 此时其偏移量和大小将作为数据值使用。

当修改文件时,如果文件将覆盖到后一个文件,则将其转移到一个合适空间。合适的空间
满足条件 >= 新文件大小 * 1.1.

Bugs

由于这个文件系统没有备份表或者其他的安全保护措施,这个设计会相当脏而且容易
损坏。如果希望测试这个文件系统,可以尝试用虚拟机(比如 qemu ).

0 0