メモリ管理コードの包括的検証の ための階層化されたメモリモデル 吉野 寿宏, 前田 俊行, 米澤 明憲 (東京大学 情報理工学系研究科) 背景 これまでのプログラム検証では、メモリ管理コードは ア・プリオリに与えられてきた • たとえば GC に依存していたり、 • 明示的な new, free があってもそれ自体は言語にビルト インであったり • Alias Types, Region-based Memory Management それに対し、メモリ管理ルーチン自体を検証しようと いう研究が近年提案されている • TALK [Maeda et al. ’06] • Separation Logic による Topsy ヒープマネージャの正当 性証明 [Nicolas et al. ’06] しかし ユーザのコードにもメモリ管理ルーチン用の理論を そのまま適用することは正しいのだろうか? • メモリ管理ルーチンとユーザコードに、それぞれ専用の システムが必要なのは好ましくない • 既存研究ではメモリ管理専用の拡張を行っているものが 多いが、そのままユーザプログラムに応用できるか? • たとえばリンク済みバイナリ全体を検証する場合 • ユーザプログラム側が独自でメモリ管理ルーチンを 持っている場合もある • 言語処理系などを相手にする場合には特によくあること そこで本研究では OS の特権階層にヒントを得て、階層化 されたメモリモデルを設計する • メモリ操作を包括的に検証するための理論を 構築することを目標 • メモリ管理ルーチンからユーザプログラムまでを モデル化 • プロトタイプの意味論、型システムの設計を 行った 階層化されたメモリモデル プログラムは、いくつかのモジュールから構成 • OS カーネル、libc (特にメモリ管理ルーチン)、 ユーザプログラム など それらのモジュールを「階層」と考え、メモリ割り当て、 解放を階層間インタラクションと捉える cf. リングプロテクションとシステムコール 階層化されたメモリモデル malloc/free の作る階層 メモリ割り当ては、自分の管理しているメモリ を下位階層へ分譲することとして解釈できる 解放は逆に、分譲していた領域の回収 OS libc malloc call ユーザ プログラム memory return 階層化されたメモリモデル malloc/free の作る階層 この各階層は隔離されている必要 • メモリブロックは各層で固有の意味を持って利用される (上位で利用 をトレースする必要はない) • 上位には管理情報などが存在し、下位からはアクセスされたくない 管理情報: 下位階層 からはアクセス不可能 OS libc ユーザ プログラム … int[2] メモリをどう使うかは割り当 てられた側の自由 … 割り当てた側は関知しない inet_addr[8] 言語・型システムの プロトタイプの設計 Alias Type[Walker et al. ‘00] をベースに • メモリの明示的管理、型の strong update に 対応 • CPS スタイルの関数呼び出し • Constraint の部分を、location と layer に関する 記述に拡張することで実現できる • 新しい操作として、export, unexport を導入 • export がメモリブロックを他レイヤに与え、unexport で奪う 言語・型システムのプロトタイプの設計 構文定義 Alias Type の Heap Constraint にレイヤ情報追加 関数にも実行レイヤ情報付加 どのレイヤから割り当てられた か(origin)、また現在の所有者 (ownership)を識別 言語・型システムのプロトタイプの設計 静的意味論 (抜粋) 逆操作 所有権の確認 逆操作 言語・型システムのプロトタイプの設計 静的意味論 (抜粋) 読み込みは誰でも可能 所有者のみが書き込める このモデルの性質 (1/2) 各階層ごとのメモリ割り当てについては、 containment が成り立つ • 上位階層の持つメモリ ⊇ 下位階層の持つメモリ • 同一のブロックについては委譲関係がリスト(origin 情報 をたどれる)になっている • 現在の定式化では委譲関係を覚えておく必要がある • また同一ブロックの所有者(ownership = +)は常にただ ひとつの階層のみ new-free の対応、export-unexport の対応が つけられる このモデルの性質 (2/2) 各階層ごとに、同一メモリブロックに対して 異なるビューが持てる • ポインタを、上位から見ると int に見えたりする • 階層間の隔離の緩和を定式化している • Strong update 時には、他のレイヤの invariant を壊さないように注意 • 現在の定式化では、int 型が subtyping relation に おける top 型に相当 • 現在他のレイヤでは int になっていることを制約として 強制 Future Work (1/2) レイヤに対して順序構造の導入 • 関数に呼び出し特権レベルなどを記述 • 順序構造に関する制約記述ができるように • モジュール化 • existential type の応用でできる 応用について考える • たとえば conservative GC の管理ルーチンの検証に 応用することができると考えている • GC Safety を証明するには、reachability の概念が必要になる ので、そのための拡張が必要 • その他に記述できるような性質はないか? Future Work (2/2) 上位に int 以外でのビューを提供 • どういった形の invariant が書けるか? Recursive Type, Union Type などの導入 • coercion においてレイヤ情報をどうやって保持するか Dependent Type の導入 • split, concat による領域分割・結合 • より現実的なメモリ管理コードをチェックできるようになる Related Work Region-based Memory Management [Tofte, Talpin ’97] • メモリを Region という単位に分けて管理するという アイデアを提唱 Capability Calculus [Crary et al. ‘99] • 上記の研究を拡張し、Capability という概念を用いること でメモリ管理を明示的に行うコードに型をつける • Capability ≒ 領域へのアクセス権限 • メモリ操作には capability を持っている必要 • そのため関数引数などに明示的に引き渡される • 複数のビューを持ったりはできない
© Copyright 2024 ExpyDoc