Данная файловая система предназначена, прежде всего, для загрузки системных файлов операционной системы, но может выполнять и роль повседневного спецхранилища, поскольку подразумевает примитивную простоту, что дает ей преимущество по скорости, а также широкий спектр прав на файлы, как и их шифрование и контроль целостности.
Набор специфик каждого файла достаточно широк, поскольку кроме собственно зарезервированных сстемных полей, стандарт подразумевает использование целого псевдо-файла - кластера для хранения расширеных специфик файла, как то мета-информации, причем хранится они должны как обычный нешифрованный файл, но с указанием специального его типа.
Контроль целостности осуществляется путем снятия контрольной криптографической хеш-суммой с области данных файла (открытого текста), пароля (при использовании шифрования) и хеш-суммы имени файла, что крайне повышает скорость прямого перебора файлов в текущем каталоге.
Ширина времени, под действие которого может попасть файл не имеет проблем и ограничений, поскольку время создания файла хранится в 64-битном числе, а модификация и просмотр фиксируется 32-битным смещением относительно последнего, что дает общий промежуток в многие миллиарды лет.
В любом случае, система, как говорилось, обладает практически неисчерпаемым ресурсом к расширению своей спецификации, что снимает проблему будущего расширения при большом технологическом скачке.
Мы посчитали необходимым и оправданным заложить подобное пространство действий, даже несмотря на просту структуру самой системы - хотя она и не предназначена для таких задач, какие решают, к примеру, ZFS или BFS, но время и опыт доказали, что лучше заложить избыточную расширяемость, чем потом "кусать себе локти".
Упрощенная спецификация файловой системы приведена ниже в виде ассемблерного кода под 86-ю архитектуру и представляет собой код генерации MBR-блока и последующих кластеров системы:
FORMAT BINARY AS 'img'
USE16
; = MBR ===================
MBR_CODE DB 446 DUP 0
PART1:
DB 0x80 ; ACTIVE
DB 0x00 ; START_HEAD
DW 0x00 ; START CYL/SECT
DB 0x47 ; Type == OFS
DB 0x00 ; END HEAD
DW 0x00 ; END CYL/SECT
DD 0x3F ; LBA START
DD 0x10000 ; PART SIZE IN SECTORS... 65k == 32M PARTITION
PART2: DB 16 DUP 0
PART3:
DB 0x00 ; ACTIVE
DB 0x00 ; START_HEAD
DW 0x00 ; START CYL/SECT
DB 0x07 ; Type == OFS
DB 0x00 ; END HEAD
DW 0x00 ; END CYL/SECT
DD 0x10040 ; LBA START
DD 0x7F0000 ; PART SIZE IN SECTORS... 65k == 32M PARTITION
PART4: DB 16 DUP 0
DB 0x55, 0xAA
;========================
PADDING1 DB 63*512 DUP 0
;========================
;== OMEGICUS FS ==============
OFS_VER = 1 ; FS VERSION
OFS_CS = 8 ; CLUSTER SIZE
OFS_SS = 512 ; SECTOR SIZE
OFS_PSIZE = 0x10000 ; PART SIZE IN SECTORS. divable by 64
OFS_EN EQU 'NONE' ; ENCRYPTION
OFS_OW EQU 'KABAKVLA' ; OWNER
OFS_BIT = 32 ; OPT RECORD SIZE (bit)
OFS_OPT_SYST EQU 0x0000001
OFS_OPT_FREE EQU 0x0000000
OFS_OPT_BADB EQU 0xFFFFFFFF
;OFS_OPT_FILL = ANY
OFS_OPT_LAST EQU 0xFFFFFFFE
;========================
; Нумерация кластеров - с 0-го, но
; пропуская 1-й.
;========================
; 32M part
OFS:
DB 0xE8, 0x58, 0x90 ; JMP
DB 'OMEGICUS' ; SIGNATURE
DB OFS_VER ; FS VERSION
DB OFS_CS ; CLUSTER SIZE IN SECTORS
DW OFS_SS ; SECTOR SIZE
DB 0 ; R
DD OFS_PSIZE ; PART SIZE IN SECTORS
DD -1 ; Number of Free Clusters (Set to -1 if Unknown)
DD -1 ; ClusterNumber of Cluster that was Most Recently Allocated OR -1
DD 0 ; R
DB OFS_EN ; ENCRYPT TYPE, 4 bytes
DQ 0, 0 ; FUTURE HASH SUMM ( and used as SerialNum too)
DQ 0 ; TIMESTAMP OF CREATION
DD 0 ; SECONDS BETWEEN ACCESSED AND CREATED
DD 0 ; SECONDS BETWEEN MODIFIED AND CREATED
DB OFS_OW ; OWNER, 8 bytes
DD ( OFS_PSIZE / OFS_CS ) * ( OFS_BIT / 8 ) / ( OFS_SS * OFS_CS ) ; OPT SIZE IN CLUSTERS. <==|
DD ( OFS_PSIZE / OFS_CS ) * ( OFS_BIT / 8 ) / ( OFS_SS * OFS_CS ) ; CL# OF ROOT DIR START ==|
DB ( OFS_SS * OFS_CS ) - ( $ - OFS ) DUP 0 ; R
; CL#0: OPT
OFS_PARTITION_TABLE:
; CL#0..7 used by ROOT OPT
DD 8 DUP OFS_OPT_SYST
DD OFS_OPT_LAST
;DD ( ( OFS_PSIZE / OFS_CS ) * ( OFS_BIT / 8 ) ) -8 -1 DUP OFS_OPT_SYST
DD ( OFS_PSIZE / OFS_CS ) -8 -1 DUP OFS_OPT_SYST
; CL#8: ROOT DIR
OFS_ROOT_DIR: ; x64bytes
DD 0x48FE2390 ; FileName Hash OR 'ZZZZ', 0x0000 - if last
DD sss_01+12 ; FileSize, bytes. with FN size
DB 12 ; FileName Size
DB 0x00 ; FileName CodePage 0 = ASCII
DW 0x8080 ; Attr
; 'DIR '
; 0x0000 = EMPTY
; 0x0001 = SYSTEM
; 0x0002 = DELETED
; 0x8080 = NORMAL FILE
DQ 0x00000000 ; CREATED UNIX TIMESTAMP64
DD 0x00000000 ; MODIFIED: SECONDS FROM CREATED
DD 0x00000000 ; ACCESSED: SECONDS FROM CREATED
DD 0x00000001 ; Type Of FILE. 0 = NONE, 1=ANY TYPE (BINARY)
DD 0x00000000 ; HASH32 OF UNENCRYPTED FILE
DD 0x00000000 ; HASH32 OF PASSWORD || 0 IF NOT ENCRYPTED
DD 0x00000009 ; START CLUSTER
DD 0x0 ; R
DQ 2 DUP 0 ; R
; PADDING REST AREA
DB (64 * (64-1)) DUP 0
; CL#9: DATA
OFS_DATUM:
DB 'testfile.txt'
ssz_01:
DB 13,13,' WELCOME TO OMEGICUS SYSTEMICUS! BE HAPPY ;-)'
sss_01 = $ - ssz_01
DB ( OFS_SS * OFS_CS ) - 12 - sss_01 DUP '+'