Physical Media Abstraction Layer
- This layer abstracts the physical format of the media into equal-sized logical allocation units called Logical Sectors using the following guidelines:Logical Sector Allocation
- This layer exists to keep track of which logical sectors have been allocated to hold data, which are available, and which are unusable (bad).
FSDLT Free Space Descriptors (FSDs)
.----.
1 | o--------->|100010010...100101| Allocation map for sectors 0 - 4095
|----|
2 | o--------->|000010101...110001| Allocation map for sectors 4096 - 8091
|----|
3 | o--------->|100100101...001000| Allocation map for sectors 8092 - 12287
|----|
. .
. .
|----|
N | o--------->|001001000...001001| Allocation map for sectors 4096*N - 4096*(N-1)-1
`----'
Where N is the number of entries in the
Free Space Descriptor table (equal to NumLogicalSectors / SectorsPerFSD,
or in this example, NumLogicalSectors / 4096).
| LogicalSectorSize | SectorsPerFSD | Bytes accounted for per FSD | FSD location entries per sector of Free Space Descriptor Location Table | Sectors accountable per sector of Free Space Descriptor Location Table | Bytes accountable per sector of Free Space Descriptor Location Table |
| 256 bytes | 2048 sectors | 16,384 bytes | 32 entries | 65,536 sectors | 16,777,216 bytes |
| 512 bytes | 4096 sectors | 32,768 bytes | 64 entries | 262,144 sectors | 134,217,728 bytes |
| 1024 bytes | 8192 sectors | 65,536 bytes | 128 entries | 1,048,576 sectors | 1,073,741,824 bytes |
| 2048 bytes | 16384 sectors | 131,072 bytes | 256 entries | 4,194,304 sectors | 8,589,934,592 bytes |
| 4096 bytes | 32768 sectors | 262,144 bytes | 512 entries | 16,777,216 sectors | 68,719,476,736 bytes |
| 8192 bytes | 65536 sectors | 524,288 bytes | 1024 entries | 67,108,864 sectors | 549,755,813,888 bytes |
File Allocation Layer
- This layer exists to group logical sectors into units called files, a file is a collection of information that logically related. In the Phoenix File System, files are described using a tree structure where that tree leafs hold the actual file information. Each node and leaf of the data tree is described using a Tree Node Descriptor:
Structure of a Tree Node Descriptor:
Offset Size Field Name Description
0h QWORD
bit 0: Type (1) Descriptor refers to SubTree block (internal node)
(0) Descriptor refers to data block (leaf)
bits 1-63: Location Logical Sector number for block location
8h QWORD Length If Type is 1, is total number of bytes described by SubTree
If Type is 0, is number of bytes in data block
----------------
Total: 16 bytes
Where each block of information is exactly 1 logical sector in size and can hold information
either about the files contents (a tree leaf) or about the location of additional blocks (a
tree node). If a sector is a data block, Length bytes
of the sector are considered to be part of the file's contents. If a sector is a SubTree block,
it is simply a consecutive list of Tree Node Descriptors and the Length
field represents the total number of bytes of the file's information that is described by
all data blocks in or under the SubTree.
Structure of a File Node:
Offset Size Field Name Description
00h DWORD MagicNumber Special number to help discern a File Node from other
data should the file system become corrupt, equal to
31534650h
04h DWORD HardLinks Number of references made from Directories to this file
08h DWORD Flags Basic file attributes
bit 0 : ArchiveFlag Set whenever the LastModified field is updated
bit 1 : SystemFlag Indicates file is an operating-system related file
bit 2 : HiddenFlag Indicates file should not be listed in default file listings
bit 3 : ReadOnlyFlag Indicates file cannot be written to or deleted
bits 4-7 : (reserved) must be 0
bit 8 : ImmediatePurge Indicates whether file should be immediately purged on delete
bits 9-15 : (reserved) must be 0
bits 16-18 : FileType Type definition for file data
000 = generic file
001 = directory
010 = symbolic link
bits 19-21 : (reserved) must be 0
bit 22 : DeletedFlag Indicates whether or not this file has been deleted
bit 23 : PurgeFlag Indicates whether or not this file is to be purged
bits 24,25 : InternalFlag Indicates what file information, if any, is stored
internally if the File Node
00 = no internal data
01 = internal rights information
10 = internal extended attributes
11 = internal file data
bits 26,27 : (reserved) must be 0
bit 28 : NodeSize Indicates whether or not the File Node occupies the full
logical sector
0 = File Node is half the size of the logical sector
1 = File Node occupies the entire logical sector
bits 29-31 : (reserved) must be 0
0Ch DWORD Owner Object ID of owner of this File Node
10h DWORD Creator Object ID which created this File Node
14h DWORD Modifier Object ID of user who last modified File Node
18h DWORD Created Date/Time File Node was created
1Ch DWORD LastModified Date/Time File Node was last modified
20h DWORD DataAccessed Date/Time file data last accessed
24h DWORD DataModified Date/Time file data last modified
28h QWORD FileSize Total length of file data
30h 1 TND Rights Rights list data tree
40h 2 TNDs EAs Extended Attributes data tree
60h 7 TNDs FileData File contents data tree
D0h x BYTES InternalData minimum of 48 bytes of space specifically set aside for
storing small amounts of data inside the File Node
without using data trees. The InternalFlag determines
which information, if any, is stored internally.
A file node is always at most 1 logical sector in size and at least 256 bytes in size, as such,
the amount of space reserved for internal data with a File Node can vary from 48 bytes to
LogicalSectorSize-208
bytes in size. A File Node may occupy an entire sector or only half of a sector, the latter
only being valid for LogicalSectorSizes of 512-bytes or
more (since one half of 512 bytes is 256 bytes, the minimum size of a File Node). Furthermore,
each File Node is identified using a File Node Number of which bits 1-63 indicate the
logical sector number the File Node resides in, and bit 0 is clear if the File Node is in the
first half of the sector and is 1 if the File Node is in the second half of the sector. The
following table summarizes the minimum and maximum sizes of File Nodes and the amount of space
reserved in each File Node for internal data, based on the size of a logical sector.
| LogicalSectorSize | Supports halfing logical sector | Minimum File Node Size | Maximum File Node Size | Minimum Internal Data Reserve | Maximum Internal Data Reserve |
| 256 bytes | No | 256 bytes | 256 bytes | 48 bytes | 48 bytes |
| 512 bytes | Yes | 256 bytes | 512 bytes | 48 bytes | 304 bytes |
| 1024 bytes | Yes | 512 bytes | 1024 bytes | 304 bytes | 816 bytes |
| 2048 bytes | Yes | 1024 bytes | 2048 bytes | 816 bytes | 1840 bytes |
| 4096 bytes | Yes | 2048 bytes | 4096 bytes | 1840 bytes | 3888 bytes |
| 8192 bytes | Yes | 4096 bytes | 8192 bytes | 3888 bytes | 7984 bytes |
| LogicalSectorSize | Maximum Internal Data Reserve | Maximum Internal Rights Info | Maximum Internal Extended Attributes | Maximum Internal File Data |
| 256 bytes | 48 bytes | 62 bytes (64 total) | 78 bytes (80 total) | 160 bytes |
| 512 bytes | 304 bytes | 318 bytes (320 total) | 334 bytes (336 total) | 416 bytes |
| 1024 bytes | 816 bytes | 830 bytes (832 total) | 846 bytes (848 total) | 928 bytes |
| 2048 bytes | 1840 bytes | 1854 bytes (1856 total) | 1870 bytes (1872 total) | 1952 bytes |
| 4096 bytes | 3888 bytes | 3902 bytes (3904 total) | 3918 bytes (3920 total) | 4000 bytes |
| 8192 bytes | 7984 bytes | 7998 bytes (8000 total) | 8014 bytes (8016 total) | 8096 bytes |
Structure of a Rights List Entry:
Offset Size Field Name Description
00h DWORD User Object ID of user or group to whom the rights pertain
04h DWORD Rights Determines what rights the User has to this file node
bit 0 : Find user may see file node
bit 1 : Read user may read file data
bit 2 : Write user may write to file data/change link location for
soft links/modify directory information for directories
(e.g. creating a new link)
bit 3 : Modify user may change information in the file node (note:
since writing data to the file node changes three
fields in the file node, we need to decide if those
are exceptions to this rule, or if a user must have
both write and modify to actually write to a file.)
bit 4 : Delete user may unlink the file from a single link
bit 5 : Purge user may purge file (unlinks all hard links at once)
bit 6 : Change access user may change the rights for the file
bit 7 : Change EA's user may change the Extended Attributes for the file
bit 8 : Change owner user may change the owner of the file
bits 9-31 : Reserved (0)
----------------
Total: 8 bytes