StupidOS/kernel/fs/stpdfs.inc

194 lines
8.2 KiB
PHP

;; File: stpdfs.inc
;; Section: Stupid Filesystem
;;
;; > ┌──────────┬───────────┬──────┬───┬──────┬────┬───┬────┐
;; > │Boot block│Super block│Inodes│...│Inodes│Data│...│Data│
;; > └──────────┴───────────┴──────┴───┴──────┴────┴───┴────┘
;; Constant: STPDFS_SB_MAGIC
;; Superblock magic number, MUST BE `0x44505453` (STPD)
STPDFS_SB_MAGIC = 0x44505453
;; Constant: STPDFS_SB_REV
;; StupidFS revision, currently `0x1`
STPDFS_SB_REV = 1
;; Constant: STPDFS_BSIZE
;; StupidFS block size (512)
STPDFS_BSIZE = 512
;; Constant: STPDFS_BADINO
;; StupidFS bad inode
STPDFS_BADINO = 0
;; Constant: STPDFS_ROOTINO
;; StupidFS root inode number
STPDFS_ROOTINO = 1
;; Constant: STPDFS_NDIRECT
;; Number of direct block (7)
STPDFS_NDIRECT = 7
;; Constant: STPDFS_INDIRECT_PER_BLOCK
STPDFS_INDIRECT_PER_BLOCK = STPDFS_BSIZE / 4
;; Constant: STPDFS_NAME_MAX
;; Max file name length (28)
STPDFS_NAME_MAX = 28
;; Enum: StupidFS State
;; STPDFS_CLEANLY_UNMOUNTED - 0
;; STPDFS_ERROR - 1
;; STPDFS_DIRTY - 1
STPDFS_CLEANLY_UNMOUNTED = 0
STPDFS_ERROR = 1
STPDFS_DIRTY = 1
;; Enum: StupidFS i-node flags
;; STPDFS_INO_FLAG_ALOC - I-node is allocated
;; STPDFS_INO_FLAG_LZP - I-node data is compressed using LZP algorithm (see <lzp.asm>)
;; STPDFS_INO_FLAG_ENC - I-node data is encrypted with XChaCha12 (see <xchacha.asm>)
STPDFS_INO_FLAG_ALOC = 0x8000
STPDFS_INO_FLAG_LZP = 0x0001
STPDFS_INO_FLAG_ENC = 0x0002
;; Constant: STPDFS_INODE_PER_BLOCK
;; I-node per block
STPDFS_INODE_PER_BLOCK = sizeof.StpdFS_Inode / STPDFS_BSIZE
;; Constant: STPDFS_DIRENT_PER_BLOCK
;; Directory entry per block
STPDFS_DIRENT_PER_BLOCK = sizeof.StpdFS_Dirent / STPDFS_BSIZE
;; Struc: StpdFS_FreeList
;;
;; .free - List of free block (0-99), index 0 point to next freelist
;; .nfree - Index
;;
;; > ┌──────────┐
;; > block 99
;; > ├──────────┤
;; > block 98
;; > ├──────────┤
;; > ...
;; > ├──────────┤
;; > block 2
;; > ├──────────┤
;; > block 1
;; > ├──────────┤ ┌──────────┐
;; > block 0 ├───►│ block 99
;; > └──────────┘ ├──────────┤
;; > ...
;; > ├──────────┤ ┌──────────┐
;; > block 0 ├───►│ block 99
;; > └──────────┘ ├──────────┤
;; > ...
;; > ├──────────┤
;; > block 0
;; > └──────────┘
;;
struc StpdFS_FreeList {
.free dd 100 dup(?)
.nfree db ?
}
;; Struc: StpdFS_Sb
;; .magic - See <STPDFS_SB_MAGIC>
;; .isize - Size in block of the i-node list
;; .fsize - Size in block of the entire volume
;; .freelist - See <StpdFS_FreeList>
;; .rev - See <STPDFS_SB_REV>
;; .state - See <StupidFS State>
;; .time - Last mod time (64bit UNIX timestamp)
struc StpdFS_Sb {
.magic dd ?
.isize dd ?
.fsize dd ?
.freelist StpdFS_FreeList
.rev db ?
.state dw ?
.time dq ?
}
DEFN StpdFS_Sb
;; Struc: StpdFS_Inode
;; StupidFS on disk i-node
;;
;; .mode - File mode
;; .nlink - Links count
;; .uid - Owner Uid
;; .gid - Group Id
;; .flags - File flags, see <StupidFS i-node flags>
;; .size - Data size in byte
;; .zone - See bellow
;; .actime - Access time (64-bit UNIX timestamp)
;; .modtime - Modification time (64-bit UNIX timestamp)
;;
;;
;; Zone 0-6 are direct, zone 7 indirect, zone 8 double indirect, zone 9 triple indirect
;; > ┌────────┐
;; >
;; > ┌───────►│Data
;; >
;; > ┌──────┐ Direct│ └────────┘
;; > │zone 0├───────┘
;; > ├──────┤
;; > ...
;; > ├──────┤ ┌────────┐ ┌────────┐
;; > │zone 6 ├─────►│
;; > ├──────┤ Indirect Data
;; > │zone 7├─────────►│
;; > ├──────┤ └────────┘ └────────┘
;; > │zone 8├───────┐
;; > ├──────┤ │Double indirect┌────────┐ ┌────────┐ ┌────────┐
;; > │zone 9 └──────────────►│ ├───►│ ├───►│
;; > └──┬───┘ Data
;; >
;; > └────────┘ └────────┘ └────────┘
;; > Triple indirect ┌────────┐
;; > └────────────────►│ ┌────────┐ ┌────────┐ ┌────────┐
;; > ├───►│
;; > ├─────►│ ├─────►│ Data
;; > └────────┘
;; > └────────┘ └────────┘ └────────┘
struc StpdFS_Inode {
.mode dw ?
.nlink dw ?
.uid dw ?
.gid dw ?
.flags dw ?
.size dd ?
.zones dd (STPDFS_NDIRECT + 3) dup(?)
.actime dq ?
.modtime dq ?
}
DEFN StpdFS_Inode
;; Struc: StpdFS_Dirent
;; StupidFS directory entry
;;
;; .inode - address of i-node
;; .name - null terminated file name (see <STPDFS_NAME_MAX>)
struc StpdFS_Dirent {
.inode dd ?
.name db STPDFS_NAME_MAX dup(?)
}
DEFN StpdFS_Dirent
; ------------------------------------------------------------------------
;; Section: Implementation
szVfsStpdFSName db 'StupidFS', 0
vops_stpdfs:
dd 0
vfs_stpdfs:
dd szVfsStpdFSName
dd 0
dd vops_stpdfs
stpdfs_init:
mov eax, vfs_stpdfs
call vfs_register
ret