tal : typed assembly language について

41
TAL : Typed Assembly Languag e にににに にににに

Upload: adora

Post on 08-Jan-2016

39 views

Category:

Documents


1 download

DESCRIPTION

TAL : Typed Assembly Language について. 前田俊行. TAL とは何か ?. Typed Assembly Language 型づけされたアセンブリ言語 ベースとして、一般的な普通のアセンブリ言語を想定している 既存の様々な CPU 上で実現可能と思われる ( 例 )TALx86 : TAL を x86 上で実現したもの. TAL で何ができるか ?. 型チェックにより次の 2 つのことを防ぐことができる 不正なメモリアクセスが行われること 不正なジャンプが行われること. TAL の流れ. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: TAL :  Typed Assembly Language について

TAL : Typed Assembly Language

について前田俊行

Page 2: TAL :  Typed Assembly Language について

TAL とは何か ?

• Typed Assembly Language

• 型づけされたアセンブリ言語– ベースとして、一般的な普通のアセンブリ

言語を想定している– 既存の様々な CPU 上で実現可能と思われ

る• ( 例 )TALx86 : TAL を x86 上で実現したもの

Page 3: TAL :  Typed Assembly Language について

TAL で何ができるか ?

• 型チェックにより次の 2 つのことを防ぐことができる– 不正なメモリアクセスが行われること– 不正なジャンプが行われること

Page 4: TAL :  Typed Assembly Language について

TAL の流れ

• TAL のアセンブラがソースファイルからオブジェクトファイルを生成する1. まず TAL のソースを型チェックする2. 型チェックをパスしたら、オブジェクト

ファイルを生成する• 生成されたオブジェクトファイルには型情報

は一切含まれない

Page 5: TAL :  Typed Assembly Language について

TAL のコード例……の前に

• 以降の例ではレジスタに関して次の条件が満たされているとする– レジスタ r1 の中身は整数– レジスタ r2 の中身は 1 つの int 要素を持つ

タプルのアドレス– レジスタ r3 の中身は命令列のアドレス

• 上の条件を以下のように書くことにする

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀

Page 6: TAL :  Typed Assembly Language について

正しい TAL コードの例

• r1 に与えられた整数を 2 倍し• r2 に与えられたアドレスに保存して• r3 に与えられたアドレスへジャンプする

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀add r4, r1, r1;st r2[0], r4;

jmp r3

Page 7: TAL :  Typed Assembly Language について

正しくない TAL コードの例(1/6)

• 不正なメモリアクセス

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀ld r4, r1[0];

jmp r3

整数をポインタとして扱ってい

る !!!

Page 8: TAL :  Typed Assembly Language について

正しくない TAL コードの例(2/6)

• 不正なメモリアクセス

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀st r3[0], r2;

jmp r3

コードを書き換えようとしてい

る !!!

Page 9: TAL :  Typed Assembly Language について

正しくない TAL コードの例(3/6)

• 不正なメモリアクセス

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀ld r1, r2[3]

jmp r3

データ領域外から読もうとして

いる !!!

Page 10: TAL :  Typed Assembly Language について

正しくない TAL コードの例(4/6)

• 不正なジャンプ

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀ jmp r1

整数をアドレスとしてジャンプして

いる !!!

Page 11: TAL :  Typed Assembly Language について

正しくない TAL コードの例(5/6)

• 不正なジャンプ

∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀jmp r2

コードでないアドレスにジャンプしてい

る !!!

Page 12: TAL :  Typed Assembly Language について

正しくない TAL コードの例(6/6)

• 不正なジャンプ

l1:∀[].{ r1 : int, r2 : < int >, r3 : [].{ } }∀

mov r3, r1; jmp l1

レジスタ r3 が飛ぼうとしているアドレスの条件を満たしてい

ない !!!

Page 13: TAL :  Typed Assembly Language について

TAL のプログラムモデル

• TAL のプログラムは次の 3 つの要素からなる– レジスタファイル R– ヒープ H– 命令列 I

Page 14: TAL :  Typed Assembly Language について

プログラムの要素 (1/3)レジスタファイル

• 各レジスタにはワード値を保存できる– ワード値とは基本的には次の 2 種類である

• ラベル ( ヒープの要素へのポインタ )• 整数

w1, …, rn wn }レジスタファイル R ::= { r1

ワード値 w ::= l ( ラベル ) i ( 整数 ) ?t | w[t] | pack [t, w] as t’ ( その他 )

Page 15: TAL :  Typed Assembly Language について

プログラムの要素 (2/3)ヒープ (1/2)

• ヒープにはヒープ値を保存できる– ヒープ値とは次の 2 種類である

• ワード値のタプル• 命令列

h1, …, ln hn }ヒープ H ::= { l1

ヒープ値 h ::= < w1, …, wn > ( タプル ) code[α1, …, αn]Γ.I ( 命令列 )

Page 16: TAL :  Typed Assembly Language について

プログラムの要素 (2/3)ヒープ (2/2)

• 実行時に malloc 命令により新たに領域を確保できる

• 解放は GC による

Page 17: TAL :  Typed Assembly Language について

プログラムの要素 (3/3)命令列

• 命令列 I は次の 3 通りで構成される– jmp v– halt[t]– (jmp と halt 以外の命令 ) ; I

Page 18: TAL :  Typed Assembly Language について

命令の種類 (1/2)

• 算術演算– add rs, rd, v (v はレジスタや即値である )– sub, mul (add と同様 )

• ジャンプ命令– jmp v

• 分岐命令– bnz rs, v

Page 19: TAL :  Typed Assembly Language について

命令の種類 (2/3)

• メモリ ( ヒープ ) アクセス命令– ld rd, rs[i]– st rd[i], rs

Page 20: TAL :  Typed Assembly Language について

命令の種類 (2/3)

• 特殊命令– malloc 命令

• ヒープから新たにデータ領域を確保する

– unpack 命令• Existential Type を unpack する

– halt 命令• ある型の値を受けとってプログラムを終了す

Page 21: TAL :  Typed Assembly Language について

TAL の型 (1/2)値の型

• 型 t ::=– α : 型変数– int : 整数– ∀[ α1, …, αn ].Γ : 命令列– < t1^φ1, … tn^φn > : タプル– ∃α.t : Existential Type

• 初期化フラグ φ ::= 0 ( 未初期化 ) 1 ( 初期化済み )

Page 22: TAL :  Typed Assembly Language について

TAL の型 (2/2)プログラムの要素の型

• ヒープの型– Ψ ::= { l1 : t1, …, ln : tn }

• レジスタファイルの型 Ψ– Γ ::= { r1 : t1, …, rn : tn }

• Type Context– Δ ::= α1, …, αn

Page 23: TAL :  Typed Assembly Language について

TAL の subtyping(1/2)

• タプル型の subtyping– 初期化済みの領域を未初期化とみなしてよ

Δ < t1^φ1, …, ti^1, …, tn^φn > ≦< t1^φ1, …, ti^0, …, tn^φn >

Δ ti

Page 24: TAL :  Typed Assembly Language について

TAL の subtyping(2/2)

• レジスタファイル型の subtyping– 使わないレジスタの型を省略してもよい

Δ { r1 : t1, ………….., rm : tm } ≦{ r1 : t1, …, rn : tn }

Δ ti (for 1 i m)≦ ≦m n≧

Page 25: TAL :  Typed Assembly Language について

TAL の static semantics( 一部 )

• プログラム (H, R, I) の妥当性の判定– ヒープが妥当であるか、そして– レジスタファイルが妥当であるか、さらに、– 命令列が妥当であるか

H : Ψ

( H, R, I )

R : ΓΨ Ψ; ; Γ I

Page 26: TAL :  Typed Assembly Language について

TAL の static semantics( 一部 )

• ヒープの妥当性の判定– ヒープの型が妥当であるか、そして– ヒープの各要素を型づけできるか

ΨΨ(li) = ti

{ l1 h1, …, ln hn } : Ψ

Ψ hi : ti hval

Page 27: TAL :  Typed Assembly Language について

TAL の static semantics( 一部 )

• レジスタファイルの妥当性の判定– レジスタの各要素が型づけできるか

Ψ { r1 w1, …, rm wm }: { r1 : t1, …, rn : tn }

Ψ; wi : ti wval (for 1 i m)≦ ≦m n≧

Page 28: TAL :  Typed Assembly Language について

TAL の static semantics( 一部 )

• 命令列の妥当性の判定 ( 一部 )– jmp 命令

• v が命令列のラベルであるか• レジスタファイルの型が、その命令列へジャ

ンプできる条件を満たしているか

Ψ; Δ; Γ

Ψ; Δ; Γ Δ Γ <= Γ’v : [].Γ’∀

jmp v

Page 29: TAL :  Typed Assembly Language について

TAL の static semantics( 一部 )

• 命令列の妥当性の判定 ( 一部 )– add 命令

• rs と v が整数 (int) であるか• 残りの命令列が妥当であるか

Ψ; Δ; Γ add rd, rs, v ; I

Ψ; Δ; Γ rs : int Ψ; Δ; Γ v : int

Ψ; Δ; Γ{ rd : int } I

Page 30: TAL :  Typed Assembly Language について

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

Page 31: TAL :  Typed Assembly Language について

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

Page 32: TAL :  Typed Assembly Language について

TAL の型チェックの例……の前に

• 以降の例では以下の仮定をおく– ヒープ H は空とする– レジスタファイル R は以下の型 Γ を持つ

と分かっているとする– Γ = { r1 : int, r2 : < int^0 >, r3 : [].{ } }∀

• 以上の仮定にもとづき、命令列の妥当性のチェックのみを示す

Page 33: TAL :  Typed Assembly Language について

正しいプログラムの型チェック

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 !

Page 34: TAL :  Typed Assembly Language について

正しくないプログラムの型チェック

ld r4, r2[0] ; jmp r3Γ

r2 : < int^0 >Γ

Γ = { r1 : int, r2 : < int^0 >, r3 : [].{ } }∀型チェックエラー

ld 命令の static semantics のう

ちφi = 1

を満たさない

Page 35: TAL :  Typed Assembly Language について

TAL プロジェクトの現状 (1/2)

• 拡張 : より現実に近づけるために– スタックを扱えるようにしている– 配列を扱えるようにしている– など

• 実装 : TALx86– TAL を x86 上で実現したものである– 型チェッカ兼アセンブラがある– GC は Boehm-GC を利用している

Page 36: TAL :  Typed Assembly Language について

TAL プロジェクトの現状 (2/2)

• 高級言語 : Popcorn– C の型安全な方言– Popcorn コンパイラは TAL のソースを生

成する– ちなみに、 Popcorn コンパイラは Popcor

n で書ける

Page 37: TAL :  Typed Assembly Language について

TAL で何ができないか ?

• リソースを制御すること• CPU 時間やメモリ使用量を制限すること

• メモリを明示的に解放すること

Page 38: TAL :  Typed Assembly Language について

TAL のまとめ

• TAL とは型づけされたアセンブリ言語である

• 型チェックにより、次のことを防げる– 不正なメモリアクセス– 不正なジャンプ

• ただし、次のことはできていない– リソース制御– 明示的なメモリ解放

Page 39: TAL :  Typed Assembly Language について

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.

Page 40: TAL :  Typed Assembly Language について

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.

Page 41: TAL :  Typed Assembly Language について

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.