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

Commit d038af0

Browse files
authored
add mem manager docs
1 parent 0645b98 commit d038af0

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

docs/mem/manager.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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

Comments
 (0)