1 of 11

allocクレートを使えるようにする

@garasubo

2 of 11

自己紹介

  • Twitter: @garasubo
  • Github: @garasubo
  • 趣味でRustで自作OSをしている
    • 技術書典で同人誌も出したり

3 of 11

no_stdプログラミング

stdはOSの機能を呼び出すことで機能を提供している

  • ファイルシステム入出力
  • スレッド・非同期処理
  • メモリ管理

OSが存在しない環境でのプログラミングではこれらの機能が使えない

4 of 11

coreクレート

no_std環境でも使える言語機能を提供

例)Option, Result, cell, fmt

ベアメタルプログラミングでは基本coreクレートに含まれる機能のみ利用可能

5 of 11

allocクレート

メモリ管理を行うアロケーターが定義されていれば使うことができるクレート

例)Vec, String, Box, Rc, Arc

6 of 11

アロケーターを実装する

要はC言語のmallocとfreeのようなものを実装してヒープ領域を管理できる何かが必要

→ alloc::alloc::GlobalAllocトレイトを実装した構造体をグローバル定数として宣言して、#[global_allocator]をつける

std環境でもアロケーターアルゴリズムを変えたい場合使うことがある

7 of 11

Rustの公式ドキュメントよりglobal_allocatorを定義する例

8 of 11

GlobalAllocを実装する

allocとdeallocを実装すればおしまい

  • alloc: Layout情報に合わせて領域を確保してポインタを返す
  • dealloc: 使い終わった領域のポインタとLayout情報を受け取り、メモリプールに返してあげる
  • Layoutにはサイズとアラインメント情報が入っている

9 of 11

アロケーター実装上の注意

  • &mut selfではなく&selfを使っての呼び出しである
    • 内部可変性を用いることでなんとかしよう(Cellなど)
  • グローバル変数なのでスレッド安全である必要がある
    • Syncを実装した形に何らかの方法でする
  • アロケーターの初期化処理はallocクレートを使う前に行う
    • std環境では暗黙に使われることがあるので注意
  • アロケーターがバグるとパニックになるので慎重に
    • Linuxではなんと独自のallocライブラリを使う!

10 of 11

アロケーターのアルゴリズム

LTで話し切るのは難しい...

  • ヒープ領域の断片化を防ぎたい
  • そこそこ高速に動作してほしい
  • MMUやキャッシュを意識したい
  • アロケーター内部ではallocクレートは当然使えない
  • アプリケーションによって最適なアルゴリズムが違う

11 of 11

参考