|
| 1 | +この章では、メモリ管理(ヒープおよびメモリマップ初期化)に関する実装について記述します |
| 2 | + |
| 3 | +## 概要 |
| 4 | +メモリ管理の実装されているファイルは`mem/manager.c`です。 |
| 5 | +このファイルでは、ヒープ領域を用いた動的メモリアロケータ(`kmalloc` / `kfree`)や、メモリマップの初期化、スタック領域の確保機能などを実装しています。 |
| 6 | +アロケータはシンプルな**フリーリスト方式**を採用しており、割り込みコンテキストでも安全に利用できるようにスピンロックで排他制御されています。 |
| 7 | + |
| 8 | +## API |
| 9 | + |
| 10 | +### 定義されている定数 |
| 11 | +- `ALIGN`: ヒープアロケータのアライメント単位(8バイト) |
| 12 | + |
| 13 | +### 関数 |
| 14 | + |
| 15 | +- **`mem_init`** -> void |
| 16 | + - **引数**: |
| 17 | + - (uint32_t) `start`: ヒープ領域の開始アドレス |
| 18 | + - (uint32_t) `end`: ヒープ領域の終了アドレス |
| 19 | + - 指定された範囲をヒープ領域として初期化します。最初のフリーブロックを作成します |
| 20 | + |
| 21 | +- **`kmalloc`** -> void*(割り当てた領域のアドレス。空きがなければNULL) |
| 22 | + - **引数**: |
| 23 | + - (uint32_t) `size`: 確保するメモリサイズ(バイト単位) |
| 24 | + - ヒープから指定サイズのメモリを確保します。必要に応じてブロックを分割します。 |
| 25 | + |
| 26 | +- **`kfree`** -> void |
| 27 | + - **引数**: |
| 28 | + - (void*) `ptr`: 解放するメモリ領域へのポインタ |
| 29 | + - `kmalloc`で確保したメモリを解放します。隣接ブロックが空きなら自動的に併合されます。 |
| 30 | + |
| 31 | +- **`mem_has_space`** -> int(1=空きあり / 0=空きなし) |
| 32 | + - **引数**: |
| 33 | + - (mem_type_t) `type`: メモリタイプ(`MEM_TYPE_HEAP` または `MEM_TYPE_FRAME`) |
| 34 | + - (uint32_t) `size`: 確保したいサイズ(バイト単位) |
| 35 | + - 指定したタイプのメモリに、連続した`size`バイト分の空きがあるかを判定します。 |
| 36 | + |
| 37 | +- **`memory_init`** -> void |
| 38 | + * 物理メモリマップ(`memmap`)を初期化し、ヒープ領域を設定します。 |
| 39 | + カーネル終了位置やメモリマップビットマップ領域を考慮し、64KBのヒープを構築します。 |
| 40 | + |
| 41 | +- **`stack_alloc`** -> void*(スタックのトップアドレス) |
| 42 | + - **引数**: |
| 43 | + - (uint32_t) `size`: スタック領域のサイズ(バイト単位) |
| 44 | + - 下方向に伸びるスタックを確保します。返り値はスタックのトップ(高位アドレス側)です。 |
| 45 | + |
| 46 | +- **`stack_free`** -> void |
| 47 | + - **引数**: |
| 48 | + - (void*) `top`: `stack_alloc`で返されたスタックのトップ |
| 49 | + - (uint32_t) `size`: 元の要求サイズ |
| 50 | + - `stack_alloc`で確保したスタック領域を解放します。 |
0 commit comments