Skip to content
This repository was archived by the owner on Jan 14, 2026. It is now read-only.

Commit 0ea5830

Browse files
authored
Marge PR#5 into main
Generate comprehensive documentation for all source files
2 parents 1cb4768 + a1ed154 commit 0ea5830

25 files changed

Lines changed: 1893 additions & 2 deletions

docs/config.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
この章では、設定ファイルについて記述します。
2+
実装されているファイルは[config.h](../../src/include/config.h)です。
3+
4+
## 概要
5+
config.hは、カーネル全体で使用されるグローバル設定と定数を定義するヘッダファイルです。バージョン情報、メモリレイアウト、VGA設定などが含まれます。
6+
7+
## 定数 / 定義
8+
9+
### バージョン情報
10+
- `VERSION`: "0.1.0" - カーネルのバージョン番号
11+
12+
### メモリ設定
13+
- `VIDEO_MEMORY`: 0xB8000 - VGAテキストメモリのベースアドレス
14+
- `COLOR`: 0x07 - デフォルトの色属性(白文字、黒背景)
15+
16+
### 機能フラグ
17+
- `INIT_MSG`: 定義されている場合、初期化メッセージを表示
18+
19+
## 構造体
20+
21+
このファイルには構造体の定義はありません。
22+
23+
## 使用方法
24+
25+
すべてのソースファイルの先頭で`#include <config.h>`をインクルードすることで、これらの設定にアクセスできます。
26+
27+
```c
28+
#include <config.h>
29+
30+
void some_function() {
31+
uint8_t *video = (uint8_t *)VIDEO_MEMORY;
32+
// VGAメモリにアクセス
33+
}
34+
```
35+
36+
### カスタマイズ
37+
38+
プロジェクト固有の設定を変更する場合は、このファイルを編集します。ビルド後、すべてのファイルが新しい設定で再コンパイルされます。

docs/device/keyboard.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
この章では、キーボードドライバについて記述します。
2+
実装されているファイルは[keyboard.c](../../src/kernel/device/keyboard.c), [keyboard.h](../../src/include/device/keyboard.h)です。
3+
4+
## 概要
5+
キーボードドライバは、PS/2キーボードからの入力を処理し、文字バッファを管理します。スキャンコードをASCII文字に変換し、Shift、Ctrl、Altキーの状態を管理します。リングバッファを使用して入力をバッファリングし、ブロッキング/ノンブロッキングの読み取りをサポートします。
6+
7+
## 関数 / API
8+
9+
#### `void keyboard_init(void)`
10+
キーボードドライバを初期化します。割り込みハンドラを登録し、キーボードからの入力を処理できる状態にします。
11+
12+
引数: なし
13+
14+
#### `void keyboard_poll(void)`
15+
キーボード入力をポーリングします(非ブロッキング)。ISRを手動で呼び出してキーボードデータポートをチェックします。
16+
17+
引数: なし
18+
19+
#### `char keyboard_getchar(void)`
20+
キーボードから1文字を取得します(ブロッキング)。バッファが空の場合、文字が入力されるまで待機します。
21+
22+
引数: なし
23+
24+
戻り値: 取得した文字
25+
26+
#### `char keyboard_getchar_poll(void)`
27+
キーボードから1文字を取得します(ノンブロッキング)。バッファが空の場合は0を返します。
28+
29+
引数: なし
30+
31+
戻り値: 取得した文字、バッファが空の場合は0
32+
33+
## 定数 / 定義
34+
35+
- `KEY_BUFFER_SIZE`: 256 - キーボード入力バッファのサイズ(バイト)
36+
- `KBD_DATA_PORT`: 0x60 - キーボードデータポート
37+
- `KBD_EVENT(irq, sc)`: IRQ番号とスキャンコードをエンコードするマクロ
38+
39+
## 構造体
40+
41+
このファイルには公開構造体の定義はありません。内部的にはリングバッファとスキャンコードマップを使用しています。
42+
43+
### 内部実装
44+
45+
- `key_buffer[]`: 文字を格納するリングバッファ(256バイト)
46+
- `buffer_read_pos`: バッファの読み取り位置
47+
- `buffer_write_pos`: バッファの書き込み位置
48+
- `scancode_map[]`: 通常のスキャンコードからASCII文字へのマッピング
49+
- `scancode_map_shift[]`: Shiftキー押下時のスキャンコードマッピング
50+
51+
### キー処理
52+
53+
- **Shift/Ctrl/Altキー**: 状態を内部変数で管理
54+
- **通常キー**: スキャンコードマップを使用してASCII文字に変換
55+
- **制御文字**: Ctrl+キーは "^" プレフィックス付きでバッファに格納
56+
- **Altキー**: 画面に表示するがバッファには追加しない

docs/device/pci.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
この章では、PCIバスドライバについて記述します。
2+
実装されているファイルは[pci.c](../../src/kernel/device/pci.c), [pci.h](../../src/include/device/pci.h)です。
3+
4+
## 概要
5+
PCIドライバは、PCIバス上のデバイスを検出し、コンフィギュレーション空間にアクセスする機能を提供します。標準的なPCIコンフィギュレーション空間アクセスメカニズムを使用して、バス、デバイス、ファンクションを列挙します。
6+
7+
## 関数 / API
8+
9+
#### `uint32_t pci_read_config_dword(uint8_t bus, uint8_t device, uint8_t func, uint8_t offset)`
10+
PCIコンフィギュレーション空間から32ビット値を読み取ります。
11+
12+
引数:
13+
- bus(uint8_t): PCIバス番号(0-255)
14+
- device(uint8_t): PCIデバイス番号(0-31)
15+
- func(uint8_t): PCIファンクション番号(0-7)
16+
- offset(uint8_t): コンフィギュレーション空間内のオフセット(4バイト境界)
17+
18+
戻り値: 読み取った32ビット値
19+
20+
#### `void pci_write_config_dword(uint8_t bus, uint8_t device, uint8_t func, uint8_t offset, uint32_t value)`
21+
PCIコンフィギュレーション空間へ32ビット値を書き込みます。
22+
23+
引数:
24+
- bus(uint8_t): PCIバス番号
25+
- device(uint8_t): PCIデバイス番号
26+
- func(uint8_t): PCIファンクション番号
27+
- offset(uint8_t): コンフィギュレーション空間内のオフセット
28+
- value(uint32_t): 書き込む値
29+
30+
#### `void pci_enumerate(void)`
31+
システム上の全PCIデバイスを列挙し、情報を出力します。全バス(0-255)、全デバイス(0-31)、全ファンクション(0-7)をスキャンします。
32+
33+
引数: なし
34+
35+
## 定数 / 定義
36+
37+
- `0xCF8`: PCIコンフィギュレーションアドレスポート
38+
- `0xCFC`: PCIコンフィギュレーションデータポート
39+
40+
## 構造体
41+
42+
このファイルには公開構造体の定義はありません。
43+
44+
### PCIコンフィギュレーション空間
45+
46+
PCIコンフィギュレーション空間の主要なオフセット:
47+
- 0x00: ベンダーID (16ビット) とデバイスID (16ビット)
48+
- 0x08: クラスコード、サブクラス、プログラミングインターフェース、リビジョンID
49+
- 0x0C: ヘッダタイプ、マルチファンクションフラグ
50+
51+
### ベンダーID
52+
53+
- 0xFFFF: デバイスが存在しない
54+
- その他: 有効なPCIデバイス

docs/driver/ata.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
この章では、ATAドライバについて記述します。
2+
実装されているファイルは[ata.c](../../src/kernel/driver/ata.c), [ata.h](../../src/include/driver/ata.h)です。
3+
4+
## 概要
5+
ATAドライバは、IDE/ATAハードディスクドライブへのアクセスを提供します。PIOモードを使用してセクタの読み書きを行い、LBA28アドレッシングをサポートします。プライマリおよびセカンダリバスの両方に対応し、マスター/スレーブドライブの検出と制御が可能です。
6+
7+
## 関数 / API
8+
9+
#### `int ata_init(void)`
10+
ATAドライバを初期化し、接続されているATAデバイスを検出します。Primary Slave、Secondary Master、Primary Masterの順にデバイスを試行します。
11+
12+
引数: なし
13+
14+
戻り値: 成功時0、失敗時-1
15+
16+
#### `int ata_read_sectors(uint8_t drive, uint32_t lba, uint8_t sectors, void *buffer)`
17+
ATAデバイスから指定されたセクタを読み取ります。
18+
19+
引数:
20+
- drive(uint8_t): ドライブ番号(0=Primary Master, 1=Primary Slave, 2=Secondary Master, 3=Secondary Slave)
21+
- lba(uint32_t): 読み取り開始LBA(Logical Block Address)
22+
- sectors(uint8_t): 読み取るセクタ数
23+
- buffer(void*): 読み取ったデータを格納するバッファ(sectors * 512バイト)
24+
25+
戻り値: 成功時0、失敗時-1
26+
27+
#### `int ata_write_sectors(uint8_t drive, uint32_t lba, uint8_t sectors, const void *buffer)`
28+
ATAデバイスへ指定されたセクタを書き込みます。
29+
30+
引数:
31+
- drive(uint8_t): ドライブ番号
32+
- lba(uint32_t): 書き込み開始LBA
33+
- sectors(uint8_t): 書き込むセクタ数
34+
- buffer(const void*): 書き込むデータのバッファ
35+
36+
戻り値: 成功時0、失敗時-1
37+
38+
## 定数 / 定義
39+
40+
### ATAレジスタ(Primary Bus)
41+
- `ATA_PRIMARY_DATA`: 0x1F0 - データレジスタ
42+
- `ATA_PRIMARY_ERROR`: 0x1F1 - エラーレジスタ(読み取り)
43+
- `ATA_PRIMARY_FEATURES`: 0x1F1 - フィーチャーレジスタ(書き込み)
44+
- `ATA_PRIMARY_SECCOUNT`: 0x1F2 - セクタカウントレジスタ
45+
- `ATA_PRIMARY_LBALOW`: 0x1F3 - LBA Low
46+
- `ATA_PRIMARY_LBAMID`: 0x1F4 - LBA Mid
47+
- `ATA_PRIMARY_LBAHIGH`: 0x1F5 - LBA High
48+
- `ATA_PRIMARY_DRIVE`: 0x1F6 - ドライブ/ヘッドレジスタ
49+
- `ATA_PRIMARY_STATUS`: 0x1F7 - ステータスレジスタ(読み取り)
50+
- `ATA_PRIMARY_COMMAND`: 0x1F7 - コマンドレジスタ(書き込み)
51+
52+
### ATAレジスタ(Secondary Bus)
53+
- `ATA_SECONDARY_DATA`: 0x170 - データレジスタ
54+
- `ATA_SECONDARY_ERROR`: 0x171 - エラーレジスタ
55+
- `ATA_SECONDARY_FEATURES`: 0x171 - フィーチャーレジスタ
56+
- `ATA_SECONDARY_SECCOUNT`: 0x172 - セクタカウントレジスタ
57+
- `ATA_SECONDARY_LBALOW`: 0x173 - LBA Low
58+
- `ATA_SECONDARY_LBAMID`: 0x174 - LBA Mid
59+
- `ATA_SECONDARY_LBAHIGH`: 0x175 - LBA High
60+
- `ATA_SECONDARY_DRIVE`: 0x176 - ドライブ/ヘッドレジスタ
61+
- `ATA_SECONDARY_STATUS`: 0x177 - ステータスレジスタ
62+
- `ATA_SECONDARY_COMMAND`: 0x177 - コマンドレジスタ
63+
64+
### ATAコマンド
65+
- `ATA_CMD_READ_PIO`: 0x20 - PIO読み取りコマンド
66+
- `ATA_CMD_WRITE_PIO`: 0x30 - PIO書き込みコマンド
67+
- `ATA_CMD_IDENTIFY`: 0xEC - IDENTIFY DEVICEコマンド
68+
69+
### ATAステータスビット
70+
- `ATA_SR_BSY`: 0x80 - ビジー(デバイスが処理中)
71+
- `ATA_SR_DRDY`: 0x40 - ドライブ準備完了
72+
- `ATA_SR_DF`: 0x20 - ドライブ書き込みエラー
73+
- `ATA_SR_DSC`: 0x10 - ドライブシーク完了
74+
- `ATA_SR_DRQ`: 0x08 - データ要求準備完了
75+
- `ATA_SR_CORR`: 0x04 - 訂正されたデータ
76+
- `ATA_SR_IDX`: 0x02 - インデックス
77+
- `ATA_SR_ERR`: 0x01 - エラー
78+
79+
### ATAエラービット
80+
- `ATA_ER_BBK`: 0x80 - 不良ブロック
81+
- `ATA_ER_UNC`: 0x40 - 訂正不可能なデータ
82+
- `ATA_ER_MC`: 0x20 - メディア変更
83+
- `ATA_ER_IDNF`: 0x10 - IDが見つからない
84+
- `ATA_ER_MCR`: 0x08 - メディア変更要求
85+
- `ATA_ER_ABRT`: 0x04 - コマンド中止
86+
- `ATA_ER_TK0NF`: 0x02 - トラック0が見つからない
87+
- `ATA_ER_AMNF`: 0x01 - アドレスマークが見つからない
88+
89+
### ATAデバイス選択
90+
- `ATA_MASTER`: 0xE0 - マスターデバイス
91+
- `ATA_SLAVE`: 0xF0 - スレーブデバイス
92+
93+
## 構造体
94+
95+
このファイルには公開構造体の定義はありません。
96+
97+
### 内部実装
98+
99+
ATAドライバはポーリングベースのPIOモードを使用します:
100+
- デバイスの準備完了を待機(BSYビットのクリア)
101+
- データ要求準備完了を待機(DRQビットのセット)
102+
- エラー検出とタイムアウト処理
103+
- 割り込みイベントの定期的な処理でFIFOオーバーフローを防止

docs/fs/block_cache.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
この章では、ブロックキャッシュについて記述します。
2+
実装されているファイルは[block_cache.c](../../src/kernel/fs/block_cache.c), [block_cache.h](../../src/include/fs/block_cache.h)です。
3+
4+
## 概要
5+
ブロックキャッシュは、ディスクI/Oのパフォーマンスを向上させるためのLRU(Least Recently Used)キャッシュです。ATAドライブからのブロック読み取り/書き込みをキャッシュし、頻繁にアクセスされるブロックをメモリに保持します。ダーティブロックの管理と遅延書き込みをサポートします。
6+
7+
## 関数 / API
8+
9+
#### `struct block_cache *block_cache_init(uint8_t drive, uint32_t block_size, uint32_t num_entries)`
10+
ブロックキャッシュを初期化します。
11+
12+
引数:
13+
- drive(uint8_t): ATAドライブ番号(例: 1 = Primary Slave)
14+
- block_size(uint32_t): ブロックサイズ(バイト、通常1024)
15+
- num_entries(uint32_t): キャッシュエントリ数(例: 32 = 32KB)
16+
17+
戻り値: ブロックキャッシュポインタ、失敗時はNULL
18+
19+
#### `int block_cache_read(struct block_cache *cache, uint32_t block_num, void *buffer)`
20+
ブロックを読み取ります(キャッシュ経由)。キャッシュにヒットすればキャッシュから返し、ミスした場合はATAドライブから読み込んでキャッシュに格納します。
21+
22+
引数:
23+
- cache(struct block_cache*): ブロックキャッシュ
24+
- block_num(uint32_t): ブロック番号
25+
- buffer(void*): 読み取ったデータを格納するバッファ
26+
27+
戻り値: 0=成功、負値=エラー
28+
29+
#### `int block_cache_write(struct block_cache *cache, uint32_t block_num, const void *buffer)`
30+
ブロックを書き込みます(キャッシュ経由)。キャッシュに書き込み、dirtyフラグを立てます。実際のディスクへの書き込みはflush時に行います。
31+
32+
引数:
33+
- cache(struct block_cache*): ブロックキャッシュ
34+
- block_num(uint32_t): ブロック番号
35+
- buffer(const void*): 書き込むデータ
36+
37+
戻り値: 0=成功、負値=エラー
38+
39+
#### `int block_cache_flush(struct block_cache *cache)`
40+
dirtyブロックをすべてディスクに書き込みます。
41+
42+
引数:
43+
- cache(struct block_cache*): ブロックキャッシュ
44+
45+
戻り値: 0=成功、負値=エラー
46+
47+
#### `void block_cache_print_stats(struct block_cache *cache)`
48+
キャッシュ統計情報(ヒット率、ミス率)を表示します。
49+
50+
引数:
51+
- cache(struct block_cache*): ブロックキャッシュ
52+
53+
#### `void block_cache_destroy(struct block_cache *cache)`
54+
ブロックキャッシュを破棄し、メモリを解放します。
55+
56+
引数:
57+
- cache(struct block_cache*): ブロックキャッシュ
58+
59+
## 定数 / 定義
60+
61+
このファイルには定数定義はありません。ブロックサイズとエントリ数は初期化時に指定します。
62+
63+
## 構造体
64+
65+
#### `struct block_cache_entry`
66+
ブロックキャッシュエントリを表す構造体です。各エントリは1ブロックのデータを保持します。
67+
68+
- `block_num(uint32_t)`: ブロック番号(0 = 無効)
69+
- `data(uint8_t*)`: ブロックデータへのポインタ
70+
- `last_used(uint32_t)`: 最終使用時刻(タイムスタンプ)
71+
- `dirty(int)`: 書き込みが必要かどうか(1=dirty, 0=clean)
72+
- `valid(int)`: このエントリが有効かどうか(1=有効, 0=無効)
73+
74+
#### `struct block_cache`
75+
ブロックキャッシュ管理構造体です。
76+
77+
- `drive(uint8_t)`: ATAドライブ番号
78+
- `block_size(uint32_t)`: ブロックサイズ(バイト)
79+
- `num_entries(uint32_t)`: キャッシュエントリ数
80+
- `entries(struct block_cache_entry*)`: エントリ配列へのポインタ
81+
- `timestamp(uint32_t)`: 現在のタイムスタンプ(LRU管理用)
82+
- `hits(uint32_t)`: キャッシュヒット数(統計情報)
83+
- `misses(uint32_t)`: キャッシュミス数(統計情報)
84+
85+
### LRUアルゴリズム
86+
87+
- **キャッシュヒット**: ブロックが既にキャッシュに存在する場合、タイムスタンプを更新
88+
- **キャッシュミス**: 無効なエントリがあれば使用、なければ最も古いエントリを置き換え
89+
- **ダーティフラグ**: 書き込まれたブロックにはdirtyフラグが立ち、flush時にディスクに書き込まれる
90+
91+
### 性能最適化
92+
93+
- セクタ単位(512バイト)からブロック単位(通常1024バイト以上)への変換
94+
- LRUアルゴリズムによる効率的なキャッシュ管理
95+
- 遅延書き込みによるI/O回数の削減

0 commit comments

Comments
 (0)