tal : typed assembly language について
DESCRIPTION
TAL : Typed Assembly Language について. 前田俊行. TAL とは何か ?. Typed Assembly Language 型づけされたアセンブリ言語 ベースとして、一般的な普通のアセンブリ言語を想定している 既存の様々な CPU 上で実現可能と思われる ( 例 )TALx86 : TAL を x86 上で実現したもの. TAL で何ができるか ?. 型チェックにより次の 2 つのことを防ぐことができる 不正なメモリアクセスが行われること 不正なジャンプが行われること. TAL の流れ. - PowerPoint PPT PresentationTRANSCRIPT
TAL : Typed Assembly Language
について前田俊行
TAL とは何か ?
• Typed Assembly Language
• 型づけされたアセンブリ言語– ベースとして、一般的な普通のアセンブリ
言語を想定している– 既存の様々な CPU 上で実現可能と思われ
る• ( 例 )TALx86 : TAL を x86 上で実現したもの
TAL で何ができるか ?
• 型チェックにより次の 2 つのことを防ぐことができる– 不正なメモリアクセスが行われること– 不正なジャンプが行われること
TAL の流れ
• TAL のアセンブラがソースファイルからオブジェクトファイルを生成する1. まず TAL のソースを型チェックする2. 型チェックをパスしたら、オブジェクト
ファイルを生成する• 生成されたオブジェクトファイルには型情報
は一切含まれない
TAL のコード例……の前に
• 以降の例ではレジスタに関して次の条件が満たされているとする– レジスタ r1 の中身は整数– レジスタ r2 の中身は 1 つの int 要素を持つ
タプルのアドレス– レジスタ r3 の中身は命令列のアドレス
• 上の条件を以下のように書くことにする
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀
正しい TAL コードの例
• r1 に与えられた整数を 2 倍し• r2 に与えられたアドレスに保存して• r3 に与えられたアドレスへジャンプする
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀add r4, r1, r1;st r2[0], r4;
jmp r3
正しくない TAL コードの例(1/6)
• 不正なメモリアクセス
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀ld r4, r1[0];
jmp r3
整数をポインタとして扱ってい
る !!!
正しくない TAL コードの例(2/6)
• 不正なメモリアクセス
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀st r3[0], r2;
jmp r3
コードを書き換えようとしてい
る !!!
正しくない TAL コードの例(3/6)
• 不正なメモリアクセス
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀ld r1, r2[3]
jmp r3
データ領域外から読もうとして
いる !!!
正しくない TAL コードの例(4/6)
• 不正なジャンプ
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀ jmp r1
整数をアドレスとしてジャンプして
いる !!!
正しくない TAL コードの例(5/6)
• 不正なジャンプ
∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀jmp r2
コードでないアドレスにジャンプしてい
る !!!
正しくない TAL コードの例(6/6)
• 不正なジャンプ
l1:∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀
mov r3, r1; jmp l1
レジスタ r3 が飛ぼうとしているアドレスの条件を満たしてい
ない !!!
TAL のプログラムモデル
• TAL のプログラムは次の 3 つの要素からなる– レジスタファイル R– ヒープ H– 命令列 I
プログラムの要素 (1/3)レジスタファイル
• 各レジスタにはワード値を保存できる– ワード値とは基本的には次の 2 種類である
• ラベル ( ヒープの要素へのポインタ )• 整数
w1, …, rn wn }レジスタファイル R ::= { r1
ワード値 w ::= l ( ラベル ) i ( 整数 ) ?t | w[t] | pack [t, w] as t’ ( その他 )
プログラムの要素 (2/3)ヒープ (1/2)
• ヒープにはヒープ値を保存できる– ヒープ値とは次の 2 種類である
• ワード値のタプル• 命令列
h1, …, ln hn }ヒープ H ::= { l1
ヒープ値 h ::= < w1, …, wn > ( タプル ) code[α1, …, αn]Γ.I ( 命令列 )
プログラムの要素 (2/3)ヒープ (2/2)
• 実行時に malloc 命令により新たに領域を確保できる
• 解放は GC による
プログラムの要素 (3/3)命令列
• 命令列 I は次の 3 通りで構成される– jmp v– halt[t]– (jmp と halt 以外の命令 ) ; I
命令の種類 (1/2)
• 算術演算– add rs, rd, v (v はレジスタや即値である )– sub, mul (add と同様 )
• ジャンプ命令– jmp v
• 分岐命令– bnz rs, v
命令の種類 (2/3)
• メモリ ( ヒープ ) アクセス命令– ld rd, rs[i]– st rd[i], rs
命令の種類 (2/3)
• 特殊命令– malloc 命令
• ヒープから新たにデータ領域を確保する
– unpack 命令• Existential Type を unpack する
– halt 命令• ある型の値を受けとってプログラムを終了す
る
TAL の型 (1/2)値の型
• 型 t ::=– α : 型変数– int : 整数– ∀[ α1, …, αn ].Γ : 命令列– < t1^φ1, … tn^φn > : タプル– ∃α.t : Existential Type
• 初期化フラグ φ ::= 0 ( 未初期化 ) 1 ( 初期化済み )
TAL の型 (2/2)プログラムの要素の型
• ヒープの型– Ψ ::= { l1 : t1, …, ln : tn }
• レジスタファイルの型 Ψ– Γ ::= { r1 : t1, …, rn : tn }
• Type Context– Δ ::= α1, …, αn
TAL の subtyping(1/2)
• タプル型の subtyping– 初期化済みの領域を未初期化とみなしてよ
い
Δ < t1^φ1, …, ti^1, …, tn^φn > ≦< t1^φ1, …, ti^0, …, tn^φn >
Δ ti
TAL の subtyping(2/2)
• レジスタファイル型の subtyping– 使わないレジスタの型を省略してもよい
Δ { r1 : t1, ………….., rm : tm } ≦{ r1 : t1, …, rn : tn }
Δ ti (for 1 i m)≦ ≦m n≧
TAL の static semantics( 一部 )
• プログラム (H, R, I) の妥当性の判定– ヒープが妥当であるか、そして– レジスタファイルが妥当であるか、さらに、– 命令列が妥当であるか
H : Ψ
( H, R, I )
R : ΓΨ Ψ; ; Γ I
TAL の static semantics( 一部 )
• ヒープの妥当性の判定– ヒープの型が妥当であるか、そして– ヒープの各要素を型づけできるか
ΨΨ(li) = ti
{ l1 h1, …, ln hn } : Ψ
Ψ hi : ti hval
TAL の static semantics( 一部 )
• レジスタファイルの妥当性の判定– レジスタの各要素が型づけできるか
Ψ { r1 w1, …, rm wm }: { r1 : t1, …, rn : tn }
Ψ; wi : ti wval (for 1 i m)≦ ≦m n≧
TAL の static semantics( 一部 )
• 命令列の妥当性の判定 ( 一部 )– jmp 命令
• v が命令列のラベルであるか• レジスタファイルの型が、その命令列へジャ
ンプできる条件を満たしているか
Ψ; Δ; Γ
Ψ; Δ; Γ Δ Γ <= Γ’v : [].Γ’∀
jmp v
TAL の static semantics( 一部 )
• 命令列の妥当性の判定 ( 一部 )– add 命令
• rs と v が整数 (int) であるか• 残りの命令列が妥当であるか
Ψ; Δ; Γ add rd, rs, v ; I
Ψ; Δ; Γ rs : int Ψ; Δ; Γ v : int
Ψ; Δ; Γ{ rd : int } I
TAL の static semantics( 一部 )
• 命令列の妥当性の判定 ( 一部 )– ld 命令
• rs は i より大きいサイズのタプルであるか• 読もうとしている領域は初期化済みか
Ψ; Δ; Γ ld rd, rs[i] ; I
Ψ; Δ; Γ rs : < t0^φ0, …, tn-1^φn-1 >Ψ; Δ; Γ{ rd : ti } I
φi = 1, 0 i ≦ < n
TAL の static semantics( 一部 )
• 命令列の妥当性の判定 ( 一部 )– st 命令
• rd は i より大きいサイズのタプルであるか• rs は書きこもうとしている領域の型と同じ型か
Ψ; Δ; Γ st rd[i], rs ; I
Ψ; Δ; Γ rd : < t0^φ0, …, tn-1^φn-1 >
Ψ; Δ; Γ{ rd : < …, ti^1, … > } I0 i ≦ < n
Ψ; Δ; Γ rs : ti
TAL の型チェックの例……の前に
• 以降の例では以下の仮定をおく– ヒープ H は空とする– レジスタファイル R は以下の型 Γ を持つ
と分かっているとする– Γ = { r1 : int, r2 : < int^0 >, r3 : [].{ } }∀
• 以上の仮定にもとづき、命令列の妥当性のチェックのみを示す
正しいプログラムの型チェック
st r2[0], r1 ; jmp r3Γ
jmp r3Γ{ r2 : < int^1 > }
r1 : intΓr2 : < int^0 >Γ
Γ{ r2 : < int^1 > } { }≦
r3 : [].{ }∀Γ
Γ = { r1 : int, r2 : < int^0 >, r3 : [].{ } }∀型チェック OK !
正しくないプログラムの型チェック
ld r4, r2[0] ; jmp r3Γ
r2 : < int^0 >Γ
Γ = { r1 : int, r2 : < int^0 >, r3 : [].{ } }∀型チェックエラー
ld 命令の static semantics のう
ちφi = 1
を満たさない
TAL プロジェクトの現状 (1/2)
• 拡張 : より現実に近づけるために– スタックを扱えるようにしている– 配列を扱えるようにしている– など
• 実装 : TALx86– TAL を x86 上で実現したものである– 型チェッカ兼アセンブラがある– GC は Boehm-GC を利用している
TAL プロジェクトの現状 (2/2)
• 高級言語 : Popcorn– C の型安全な方言– Popcorn コンパイラは TAL のソースを生
成する– ちなみに、 Popcorn コンパイラは Popcor
n で書ける
TAL で何ができないか ?
• リソースを制御すること• CPU 時間やメモリ使用量を制限すること
• メモリを明示的に解放すること
TAL のまとめ
• TAL とは型づけされたアセンブリ言語である
• 型チェックにより、次のことを防げる– 不正なメモリアクセス– 不正なジャンプ
• ただし、次のことはできていない– リソース制御– 明示的なメモリ解放
References(1/3)
• 以降の論文は以下の TAL のページから入手可能です http://www.cs.cornell.edu/talc/
• Greg Morrisett, David Walker, Karl Crary, and Neal Glew. “From System F to Typed Assembly Language” In the 25th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages, page 85-97, January 1998.
References(2/3)
• Greg Morrisett, Karl Crary, Neal Glew, and David Walker. “Stack-Based Typed Assembly Language” In the 1998 Workshop on Types in Compilation, March 1998. Published in LNCS, volume 1473, page 28-52. Springer-Verlag, 1998.
References(3/3)
• Greg Morrisett, Karl Crary, Neal Glew, Dan Grossman, Richard Samuels, Frederick Smith, David Walker, Stephanie Weirich, and Steve Zdancewic. “TALx86 : A Realistic Typed Assembly Language” In the 1999 ACM SIGPLAN Workshop on Compiler Support for System Software, pages 25-35, May 1999.