Physical Media Abstraction Layer
- This layer abstracts the physical format of the media into equal-sized logical allocation units called Device-Logical Sectors using the following guidelines:Volume Abstraction Layer
- This layer manages partitioning of physical media into segments as well as the grouping of one or more segments into logical volumes. Furthermore, this performs mapping between logical sectors, which are used by all higher level file system layers, and Device-Logical Sectors.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 | 8,192 sectors | 65,536 bytes | 128 entries | 1,048,576 sectors | 1,073,741,824 bytes |
| 2048 bytes | 16,384 sectors | 131,072 bytes | 256 entries | 4,194,304 sectors | 8,589,934,592 bytes |
| 4096 bytes | 32,768 sectors | 262,144 bytes | 512 entries | 16,777,216 sectors | 68,719,476,736 bytes |
| 8192 bytes | 65,536 sectors | 524,288 bytes | 1024 entries | 67,108,864 sectors | 549,755,813,888 bytes |
| 16384 bytes | 131,072 sectors | 1,048,576 bytes | 2048 entries | 268,435,456 sectors | 4,398,046,511,104 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 --- end general flags, begin internal flags --- 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. ---------------- Total: 256 bytes minimumA 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 |
| 16384 bytes | Yes | 8192 bytes | 16384 bytes | 7984 bytes | 16176 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 |
| 16384 bytes | 16176 bytes | 16190 bytes (16192 total) | 16206 bytes (16208 total) | 16388 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 read file node information
bit 1 : Read user may read file data
For generic files : may read the "contents" of the file
For directories : may scan the directory contents
For symbolic links : may see where the link points to
bit 2 : ReadRights user may read the rights information of the file node
bit 3 : ChangeRights user may modify the rights information in the file node
bit 4 : ChangeEAs user may modify the extended attributes of the file node
bit 5 : ChangeOwner user may change the ownership of a file node
bit 6 : ChangeFlags user may modify the file node's general flags
bit 7 : Unlink user may remove a link to this file node
bit 8 : Write user may modify the file data of a generic file
bit 9 : Redirect user may change the file data of a symbolic link
bit 10 : Create user may add an entry to a directory (modify directory file data)
bit 11 : Rename user may rename an entry in a directory (modify directory file data)
bit 12 : Remove user may remove an entry from a directory (modify directory file data)
bits 13-23 : (reserved) must be 0
24 : Supervisor user has all rights to the file node
bits 25-30 : (reserved) must be 0
bit 31 : InheritMask (1) rights list entry is an inherited rights mask
(0) rights list entry contains access rights
----------------
Total: 8 bytes
Rights for a given user are resolved using the fully qualified path of the file in question.
The rights list of the file are scanned for an entry explicitly defining the rights of the user in question,
if an entry is found then it completely determines the user's rights.
If not, the parent directory's rights list is scanned for an entry explicitly defining the rights of the user,
if an entry is found then it determines the user's rights, modifiable by an inherited rights mask. If an
entry is not found, the process is continued up the directory tree until the root is reached. If the root is
reached and no rights were ever defined, then the entire process is repeated per group the user belongs to.
If no rights entries are found to be applicable to the user, then the user is presumed to have no rights for
the given file node. The fact that directories which constitute the fully qualified path to the file
can determine a file's access rights illustrates that rights for a file may be inherited. In addition, this
also illustrates how through the use of inheritance, two directory entries which are linked to the same
file node may actually have different access rights. Even though the rights list for the file node is the
same for both directory entries (since both entries actually refer to the same file), the inherited rights
can differ.
File or Directory Access Rights Inherited Rights Mask effective Inherited Rights Mask
/example/of/rights 11111111...11
/example/of 11110111...11 11110111...11
/example 11011111...01 10011111...11 10010111...11
/ 00001100...00 10010111...11
So the given user's access to the file node linked to /example/of/rights would be
Access Rights : 11011111...01
effective Inherited Rights Mask : 10010111...11 AND
--------------
user's effective access rights : 10010111...01
One thing worth pointing out is that a user's accessed rights are determined by a single rights list entry
either located in the file node's rights list or in a directory's rights list which forms the fully qualified
path to the given file.
On the other hand, a user's Inheritied Rights Mask is determined by AND'ing appropriate Inherited Rights Mask
entries from each directory that forms the fully qualified path to the given file. Futhermore, a
effective Inheritied Rights Mask is only applied when the user inherited their rights to a file from a
directory above the file (ie. the given file did not explicitly list access rights for the given user or a
group that the user belongs to).
The SuperBlock
I'm just going to make notes of what fields that will need to be in the superblock as we think of them, we can go back and define the format later.Location of Free Space Descriptor Table Bad Block List tree descriptor Root Directory tree descriptor Volume Descriptor List tree descriptor File System Version Number Number of bytes of reserved space in File Nodes for internal data