ディスクフォーマットの仕様書を書きました。

こんにちは、Takymです。
この記事は自作OS Advent Calendar 2019の25日目の記事です。
これから作る予定のOSで使うディスクフォーマットの仕様書を書きました。

自作する理由

ただ単純に作りたかったからです。それ以外の理由は殆どありません。
将来作る自分のOSで使う予定ですが、その自作OSも作りたい理由がただ作りたいだけです。

# YFT 仕様 v0
Copyrught (C) 2019 Takym.
## 基本型
この仕様書で定義される型は以下の基本的な整数型のみ利用します。
大きさは全てバイト単位です。整数型は全てリトルエンディアンです。
|型名 |大きさ|範囲(10進数) |説明 |
|:-----–|-----:|:-----------------------------------—-:|:-------------------------|
|uint08_t| 1|0~255 |符号無し 8ビット整数です。|
|uint16_t| 2|0~65535 |符号無し16ビット整数です。|
|uint32_t| 4|0~4294967295 |符号無し32ビット整数です。|
|uint64_t| 8|0~18446744073709551615 |符号無し64ビット整数です。|
|sint08_t| 1|-128~127 |符号付き 8ビット整数です。|
|sint16_t| 2|-32768~32767 |符号付き16ビット整数です。|
|sint32_t| 4|-2147483648~2147483647 |符号付き32ビット整数です。|
|sint64_t| 8|-9223372036854775808~9223372036854775807|符号付き64ビット整数です。|
|bool_t | 1|FALSE(0),TRUE(1) |論理値です。 |
## 日時情報 (YFT_DATETIME, DateTime, 7バイト)
日付と時間の情報を低用量で保持します。
|名前 |位置|大きさ|型 |説明 |
|:-----—|—:|-----:|:-----–|:----------------|
|data_high| +0| 4|uint32_t|上位4バイトです。|
|data_mid | +4| 2|uint16_t|中位2バイトです。|
|data_low | +6| 1|uint08_t|下位1バイトです。|
## 日時情報オブジェクト (YFT_DATETIME_OBJECT, DateTimeObject, 11バイト)
日付と時間の情報をプログラムから読み取り易い形で保持します。
|名前 |位置|大きさ|型 |説明 |
|:-----—|—:|-----:|:-----–|:---------------–|
|years | +0| 4|uint32_t|年を表します。 |
|months | +4| 1|uint08_t|月を表します。 |
|days | +5| 1|uint08_t|日を表します。 |
|hours | +6| 1|uint08_t|時を表します。 |
|minutes | +7| 1|uint08_t|分を表します。 |
|seconds | +8| 1|uint08_t|秒を表します。 |
|ticks | +9| 2|uint16_t|ミリ秒を表します。|
### 日時情報と日時情報オブジェクトの変換
日時情報は日時情報オブジェクトの変換方法の解説をします。
以下の表通りに必要最低限のデータのみを抽出します。
|フィールド|必要範囲 |必要ビット|略記|補足 |
|:-----—-|:-----–:|-----—-:|:–:|:---------------—|
|years |‭0-1048575‬| 20bit|Y | |
|months |1-12 | 4bit|M |値から1を引きます。|
|days |1-31 | 5bit|D |値から1を引きます。|
|hours |0-23 | 5bit|h | |
|minutes |0-59 | 6bit|m | |
|seconds |0-59 | 6bit|s | |
|ticks |0-999 | 10bit|t | |
そしたら、抽出したデータを以下の様に並び替えます。
* **data_high**: `YYYY YYYY YYYY YYYY YYYY MMMM DDDD Dhhh`
* **data_mid** : `hhmm mmmm ssss sstt`
* **data_low** : `tttt tttt`
## グローバル一意識別子 (YFT_GUID, Guid, 16バイト)
グローバル一意識別子を保持します。
|名前 |位置|大きさ|型 |説明 |
|:—-|—:|-----:|:----------|:----------–|
|data1| +0| 4|uint32_t |データ1です。|
|data2| +4| 2|uint16_t |データ2です。|
|data3| +6| 2|uint16_t |データ3です。|
|data4| +8| 8|uint08_t[8]|データ4です。|
## 種類 (uint08_t, EntryType, 1バイト)
項目登記の種類を表します。項目登記については後述します。
種類は以下の表の通りです。値は16進数です。
|名前 |表示名 |値 |説明 |
|:--------------------—-|:---------------–|—:|:---------------------------------------------------------------------------—-|
|YFT_TYPE_NULL |存在しない項目 |0x00|この項目以降に項目登記が存在しない事を表します。 |
|YFT_TYPE_DATA_FILE |バイナリファイル |0x01|通常のデータファイルを表します。 |
|YFT_TYPE_TEXT_FILE |テキストファイル |0x02|ASCIIで符号化されたテキストファイルを表します。今後はUTF-8に変更される予定です。|
|YFT_TYPE_TEMP_FILE |一時ファイル |0x03|一時的に作成され後に削除されるファイルを表します。 |
|YFT_TYPE_DYNAMIC_FILE |動的ファイル |0x04|現在はまだ未使用です。 |
|YFT_TYPE_REACTIVE_FILE |動的ファイル |0x04|動的ファイルの別名です。 |
|YFT_TYPE_SYMBOLIC_LINK |ショートカット |0x05|現在はまだ未使用です。 |
|YFT_TYPE_FOLDER |フォルダ |0x10|通常のディレクトリを表します。 |
|YFT_TYPE_JUNCTION |ジャンクション |0x11|現在はまだ未使用です。 |
|YFT_TYPE_MOUNT_POINT |マウントポイント |0x12|現在はまだ未使用です。 |
|YFT_TYPE_BACKUP_STORAGE |バックアップ保管庫|0x13|現在はまだ未使用です。 |
|YFT_TYPE_RECYCLE_BIN |ゴミ箱 |0x14|現在はまだ未使用です。 |
|YFT_TYPE_GARBAGE_CAN |ゴミ箱 |0x14|ゴミ箱の別名です。 |
|YFT_TYPE_DYNAMIC_DIR |動的フォルダ |0x15|現在はまだ未使用です。 |
|YFT_TYPE_REACTIVE_DIR |動的フォルダ |0x15|動的フォルダの別名です。 |
|YFT_TYPE_BOOT_RECORD |ブートレコード |0x20|ディスクの最初の2セクタの領域を持つファイルを表します。 |
|YFT_TYPE_ALLOCATION_TABLE|割り当て表 |0x21|ディスクの利用/未使用領域を表す情報を保持したファイルを表します。 |
|YFT_TYPE_LONG_FILE_NAME |長いファイル名情報|0xF0|現在はまだ未使用です。 |
|YFT_TYPE_REMOVED |移動/削除済み |0xFF|移動または削除が行われた項目を表します。 |
## 属性 (uint08_t, Attribute, 1バイト)
項目登記のビットフラグで表現された属性を表します。
属性は以下の表の通りです。値は2進数です。
|名前 |表示名 |値 |説明 |
|:--------------------–|:---------------—-|-----—-:|:-----------------------------------------------------------------|
|YFT_ATTR_NULL |属性無し |0b00000000|属性が無い事を表します。 |
|YFT_ATTR_HIDDEN |隠しファイル |0b00000001|ユーザーに対して表示しない項目です。 |
|YFT_ATTR_SYSTEM |システムファイル |0b00000010|システムで利用され、ユーザーによって変更されてはいけない項目です。|
|YFT_ATTR_COMPRESSED |圧縮済み |0b00000100|現在はまだ未使用です。 |
|YFT_ATTR_ENCRYPTED |暗号化済み |0b00001000|現在はまだ未使用です。 |
|YFT_ATTR_FRAGMENT |断片化済み |0b00010000|ファイルデータが連続で並んでいない状態を表します。 |
|YFT_ATTR_RECOVERABLE |復元可能 |0b00100000|現在はまだ未使用です。 |
|YFT_ATTR_LONG_FILE_NAME|長いファイル名を持つ|0b01000000|現在はまだ未使用です。 |
|YFT_ATTR_RESERVED_FLAG |予約済み (拡張用) |0b10000000|現在はまだ未使用です。どの用途で利用するかも未定です。 |
## 権限 (uint08_t, Permission, 1バイト)
項目登記のビットフラグで表現されたアクセス権限を表します。
権限は以下の表の通りです。値は2進数です。
|名前 |表示名 |値 |説明 |
|:--------------------—|:----------------|-----—-:|:-------------------------------------------------------—-|
|YFT_PERM_READ |読み取り可能 |0b10000000|読み取りが許可されています。 |
|YFT_PERM_WRITE |書き込み可能 |0b01000000|書き込みが許可されています。 |
|YFT_PERM_DELETE |削除可能 |0b00100000|項目登記の種類を `YFT_TYPE_REMOVED` に変更できます。 |
|YFT_PERM_CHANGE |変更可能 |0b00010000|項目登記の情報を変更できます。 |
|YFT_PERM_EXECUTE |実行可能 |0b00001000|ファイルが実行可能プログラムの場合、実行が許可されています。|
|YFT_PERM_RESERVED_FLAG_1|予約済み (拡張用)|0b00000100|現在はまだ未使用です。どの用途で利用するかも未定です。 |
|YFT_PERM_RESERVED_FLAG_2|予約済み (拡張用)|0b00000010|現在はまだ未使用です。どの用途で利用するかも未定です。 |
|YFT_PERM_RESERVED_FLAG_3|予約済み (拡張用)|0b00000001|現在はまだ未使用です。どの用途で利用するかも未定です。 |
|YFT_PERM_NULL |権限無し |0b00000000|ファイルに対する操作が全て拒否されています。 |
|YFT_PERM_FULL_CONTROL |完全制御可能 |0b11111111|ファイルに対する操作が全て許可されています。 |
## 状態 (uint08_t, EntryState, 1バイト)
項目登記のビットフラグで表現された状態を表します。
状態は以下の表の通りです。値は2進数です。
|名前 |表示名 |値 |説明 |
|:---------------|:----------—|-----—-:|:---------------------------------------------------------------------------------|
|YFT_STATE_NULL |状態無し |0b00000000|項目が通常の状態である事を表します。 |
|YFT_STATE_SHARED|アクセス共有中|0b00000001|あるプロセスによって利用され、他のプロセスからも利用可能である事を表します。 |
|YFT_STATE_LOCKED|アクセス保護中|0b00000010|あるプロセスによって利用され、他のプロセスからの利用が制限されている事を表します。|
|YFT_STATE_USING |利用中 |0b00000011|あるプロセスによって利用されている事のみを表します。 |
## ファイル修飾子 (YFT_MODIFIERS, Modifiers, 4バイト)
項目登記の種類、属性、権限、状態を保持します。
|名前 |位置|大きさ|型 |説明 |
|:-----|—:|-----:|:-----—-|:-----|
|type | +0| 1|EntryType |種類。|
|attr | +1| 1|Attribute |属性。|
|perm | +2| 1|Permission|権限。|
|status| +3| 1|EntryState|状態。|
## ファイル情報 (YFT_FILE_INFO, FileInfo, 64バイト)
ファイル名、大きさ等のファイルの基本情報を保持する項目登記です。
|名前 |位置|大きさ|型 |説明 |
|:----------|—:|-----:|:-----------|:---------------------------------------------------------------------------–|
|mod | + 0| 4|Modifiers |ファイルの修飾子です。 |
|addr | + 4| 4|uint32_t |ファイルの最初のセクタのディスク位置です。セクタ単位で表されます。 |
|sectors | + 8| 4|uint32_t |ファイルのセクタ数です。 |
|actual_size| +12| 4|uint32_t |バイト単位で表されたファイルの実際の大きさです。これは参考値です。 |
|filename | +16| 32|uint08_t[32]|ASCIIで表現された32バイトの文字列です。今後のバージョンでUTF-8に変更されます。|
|created | +48| 7|DateTime |ファイルが最初に作成された日時です。 |
|updated | +55| 7|DateTime |ファイルの最終更新が行われた日時です。 |
|reserved | +62| 2|uint16_t |予約済みのフィールドです。値は `0xFFFF` で埋めて置く事を推奨します。 |
## 長いファイル名 (YFT_LONG_FILE_NAME, LongFileName, 64バイト)
長いファイル名の情報を保持する項目登記です。
現在は利用されていません。
|名前 |位置|大きさ|型 |説明 |
|:-----–|—:|-----:|:-----------|:-------------------------–|
|mod | +0| 4|Modifiers |長いファイル名の修飾子です。|
|filename| +4| 60|uint08_t[60]|追加のファイル名です。 |
## 項目登記 (YFT_ITEM_ENTRY, ItemEntry, 64バイト)
項目の情報を保持する共用体です。
|名前 |位置|大きさ|型 |説明 |
|:—-|—:|-----:|:-----------|:-------------------------–|
|mod | +0| 4|Modifiers |項目の修飾子です。 |
|finfo| +0| 64|FileInfo |ファイル情報です。 |
|lfn | +0| 64|LongFileName|長いファイル名情報です。 |
### 補足
容量が64バイトで、且つ、最初の4バイトがファイル修飾子(Modifiers)なら項目登記と呼ばれます。
## ディスクの種類 (uint16_t, DiskType, 2バイト)
ディスクの種類を表します。値は16進数です。
ディスクがどの様な機能を持つか表す機能ビットとディスクの種別を表す種別ビットの論理和で表されます。
|名前 |表示名 |値 |説明 |
|:--------------------|:---------------–|-----:|:-------------------------------------------------------—-|
|YFT_DISK_REWRITABLE |書き換え可能 |0x0001|物理的にディスク全体の上書きが可能である事を表します。 |
|YFT_DISK_READONLY |読み取り専用 |0x0002|物理的にディスクに変更を加える事ができない事を表します。 |
|YFT_DISK_REMOVABLE_RW|取り換え可能 (書) |0x0003|物理的にディスクを取り外せる事を表します。上書き可能です。 |
|YFT_DISK_REMOVABLE_RO|取り換え可能 (読) |0x0004|物理的にディスクを取り外せる事を表します。読み取り専用です。|
|YFT_DISK_HDD |HDD/SSD |0x0100|ディスクがHDDまたはSSDである事を表します。 |
|YFT_DISK_FLASH_MEMORY|フラッシュメモリ |0x0200|ディスクがフラッシュメモリである事を表します。 |
|YFT_DISK_FLOPPY |フロッピーディスク|0x0300|ディスクがフロッピーディスクである事を表します。 |
|YFT_DISK_OPTICAL_DISC|光学ディスク |0x0400|ディスクが光学ディスクである事を表します。 |
|YFT_DISK_VIRTUAL |仮想ディスク |0x0500|ディスクが仮想ディスクである事を表します。 |
|YFT_DISK_WORK_MASK |機能ビットマスク |0x00FF|値から機能ビットを取り出す時に使用します。 |
|YFT_DISK_KIND_MASK |種別ビットマスク |0xFF00|値から種別ビットを取り出す時に使用します。 |
## ボリューム情報 (YFT_VOLUME_INFO, VolumeInfo, 64バイト)
ボリュームに関する情報を保持します。
|名前 |位置|大きさ|型 |説明 |
|:----------|—:|-----:|:-----------|:---------------------------------------------------------------------------------|
|signature | + 0| 8|uint64_t |YFTとして正しくフォーマットされている事を示す署名です。常に `YFT_SIGNATURE` です。|
|disk_type | + 8| 2|DiskType |ディスクの種類を表します。 |
|sector_size| +10| 2|uint16_t |1セクタの512バイト単位での大きさです。 |
|disk_size | +12| 4|uint32_t |ディスクのセクタ単位での容量です。 |
|version | +16| 4|uint32_t |YFTのフォーマットバージョンです。現在は `0x00000000` です。 |
|created | +20| 7|DateTime |ディスクが最初にフォーマットされた日時です。 |
|updated | +27| 7|DateTime |ディスクの最終更新が行われた日時です。 |
|reserved | +34| 14|uint08_t[14]|予約済みのフィールドです。値は `0xFFFF` で埋めて置く事を推奨します。 |
|serial | +48| 16|Guid |ディスクを認識する為の一意に定まる識別子です。 |
* **YFT_SIGNATURE**: 0xF0DE615469466159
* `sector_size` をバイト単位に変換するには512倍する必要があります。
## ドライブ情報 (YFT_DRIVE_INFO, DriveInfo, 512バイト)
ボリューム情報とディスクに保存される重要な情報への項目登記を保持します。
YFTではボリューム情報以外の情報はファイルとして保存されます。
|名前 |位置|大きさ|型 |説明 |
|:-----–|—:|-----:|:-----—-|:-------------------------------------------------------------------------------------------|
|vinfo |+ 0| 64|VolumeInfo|ボリュームの基本的な情報です。 |
|next_ldr|+ 64| 64|FileInfo |第二次ローダーのファイル情報です。ディスクにOSが保存されている場合に利用されます。 |
|reserved|+128| 64|FileInfo |現在のバージョンでは未使用です。 |
|trash |+192| 64|FileInfo |現在はまだ未使用です。 |
|main_bs |+256| 64|FileInfo |現在はまだ未使用です。 |
|br |+320| 64|FileInfo |ディスクの先頭の2セクタのファイル情報です。YFTではドライブ情報もブートレコードに含まれます。|
|at |+384| 64|FileInfo |割り当て表のファイル情報です。 |
|root |+448| 64|FileInfo |ルートディレクトリのファイル情報です。 |
## ディレクトリ情報 (YFT_DIRECTORY_INFO, DirectoryInfo, 64バイト)
フォルダの基本的な情報を表します。
|名前 |位置|大きさ|型 |説明 |
|:----------–|—:|-----:|:-----------|:-------------------------------------------------------------------------------------|
|signature | + 0| 8|uint64_t |YFTとして正しくフォーマットされている事を示す署名です。常に `YFT_SIGNATURE_DIR` です。|
|saved_entries| + 8| 4|uint32_t |フォルダに保存されている項目登記の数です。`YFT_TYPE_REMOVED` は含まれません。 |
|max_entries | +12| 4|uint32_t |フォルダが収容できる項目登記の数です。 |
|freespace | +16| 48|uint08_t[48]|自由領域です。現在のバージョンでは利用されていません。 |
* **YFT_SIGNATURE_DIR**: 0xA1D8C4B8DAA8DEC3
## 割り当て表ヘッダ情報 (YFT_AT_HEADER, AlloctblHeader, 64バイト)
割り当て表の基本的な情報を表します。
|名前 |位置|大きさ|型 |説明 |
|:-----—-|—:|-----:|:-----------|:--------------------------------------------------------------------------------—-|
|signature | + 0| 8|uint64_t |YFTとして正しくフォーマットされている事を示す署名です。常に `YFT_SIGNATURE_AT` です。|
|entries | + 8| 4|uint32_t |割り当て表に保存されている空きエントリの数です。 |
|total_used| +12| 4|uint32_t |利用されている領域の合計値です。セクタ単位で表されます。 |
|freespace | +16| 48|uint08_t[48]|自由領域です。現在のバージョンでは利用されていません。 |
* **YFT_SIGNATURE_AT**: 0x6C6254636F6C6C41
## 割り当て表空きエントリ (YFT_AT_ENTRY, AlloctblEntry, 8バイト)
空き領域を表します。
|名前|位置|大きさ|型 |説明 |
|:—|—:|-----:|:-----–|:-------------------------------|
|addr| +0| 4|uint32_t|セクタ単位でのディスク位置です。|
|size| +4| 4|uint32_t|セクタ単位での大きさです。 |

https://cdn.rawgit.com/chjj/marked/master/marked.min.js

spec = document.getElementById(“spec”);
spec.innerHTML = marked(spec.innerHTML);

参考にしたページ

Windows互換じゃなくて独自のファイルシステムを作ろう!

後書き

感想・意見・質問・誤字・脱字等はこの記事のコメント欄にお願いします。 最後まで読んでくださってありがとうございました。

コメントを残す

WordPress.com で次のようなサイトをデザイン
始めてみよう