仮想メモリ管理

base version : v0.1.0

仮想メモリ管理とは、端的に言うとmallocとdeleteである。

Raph Kernelでは、仮想メモリ管理機構であるVirtmemCtrlが起動するまでに仮想メモリ空間で確保されるメモリをリンカスクリプトで定義している。(例えば、スタックはVirtmemCtrlが起動する前に設定しなければいけない。→kernel/kernel.ld#L84)ただし、リンカスクリプトは厳密には、物理メモリ管理機構が起動するまでの物理メモリの使い方を定義している事に注意して欲しい。起動直後は物理メモリと仮想メモリが1対1対応しているから、物理メモリを定義しているリンカスクリプトで仮想メモリの使い方も必然的に定義されている、というだけの事である。

VirtmemCtrl

VirtmemCtrlは、他のアプリケーションからも利用されるため、Raph Libraryにインターフェース定義されている。(→Raph_Library/rlib/mem/virtmem.h

カーネルではこれをKVirtmemCtrlが継承する事で実装されている。(→kernel/mem/kvirtmem.h)ただし、KVirtmemCtrlの主な役割は、仮想メモリが足りなくなった際に、動的に物理メモリを確保(→物理メモリ管理<執筆中>)して、マッピングする(→ページング<執筆中>)事であり、それ以外の作業(実際のメモリ確保、解放)はdlmallocに一任している。

仮想メモリが足りなくなった場合の処理は、KVirtmemCtrl::Sbrkに記述されている。

dlmalloc

昔のコードではKVirtmemCtrl内で独自のメモリ確保解放処理を行っていたのだが、アルゴリズムが悪く、性能上のボトルネックとなってしまっていた。ここでアルゴリズムを改善しても良かったのだが、メモリ管理コードとしてはdlmallocが最強なので、こちらを移植する事にした。

ちなみに、dlmallocもマルチスレッド環境下では遅いとかいろいろあるのだけど、まあそこについては今は置いておく。

dlmallocはもともと組み込みを想定して書かれているので、移植性は大変高い。sbrk(Raph KernelではKVirtmemCtrl::Sbrk)を用意する事と、後幾つかdefineマクロで定義されているフラグを弄れば、dlmalloc.cをコピーしてくる(→dlmalloc.c)だけで、すぐに動いてしまう。ここまで組み込み易いプログラムも珍しい。
ちなみに、dlmallocのメモリ確保解放コストはO(1)と大変早いのだが、では具体的にどんなアルゴリズムを採用しているか、という事についてはdlmallocの公式ページやこちらの解説が参考になる。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中