# 研究目的
- OSの信頼性を保証する必要がある
- 信頼性の保証にはモデル検査や定理証明を使用したい
- 継続ベースの状態遷移系で再実装することで表現しやすくしたい
- 既存のunixであるxv6をCbCで書き換えて、検証を行いやすくしたい
- kernel/user両方をCbCで実装する
- CbCの変換スクリプトなどはPerlで実装されており煩雑
- CbCを用いたプログラミング言語を作りたい
- GearsOS用の内部言語
- Cに依存しないCbCのsyntaxを作成する
- 実装のプロトタイプとしてCbCを用いてインタプリタ/コンパイラを作成する
# 進捗
- Gearsの例題の修正とgenerate_stubの修正
- 様々な理由でperlインタプリタを読んでいた
- xv6そろそろやりはじめた
- シス管関係……
明日寄稿した雑誌が発売します!!
# Gearsの例題
# インタプリタ/コンパイラ
- 実装に進める段階までコードを直した(セグフォしなくなった)
- Gearsのプログラムを停止させる場合は次のCodeGearを呼び出す必要がある
|
|
exit_code
はtaskManager経由で呼び出さないとセグフォする- 今までは
par goto
が全て終了したタイミングでcode2
が実行されていた
- 今までは
# generate_stubのバグ修正
|
|
こういうCodeGearを書いた場合次のマクロが生成されてほしい
|
|
…が、Gearef(context, Lexer)->next
が生成されず、Gearef(context, Lexer)->lexer
に代入されてしまっていた
#
hoge->next
に値摘んでくれない問題
generate_stub
の527行目くらいが問題そう- 実際にgoto文を生成している場所
|
|
- デバッグしたところ問題となってるのがこのところ
|
|
-
$next
は次のCodeGearの名前じゃなくて、インスタンスが入っている -
my $prot = $code{$ntype}->{$method};
でInterfaceのメソッド一覧を取り出している$ntype
は現在のinterface名、$method
は->
で呼び出す先
-
なんかデバッガでdumpしたら
%code
が明らかにおかしい結果に…Lexer
とLexer
が混在している- ここが関係していそう
|
|
# 原因
- InterfaceからCodeGearを取り出す箇所のキャプチャがおかしかった
書いていたInteface
|
|
ここのtypedef struct Lexer <Type
の行をキャプチャしにいっていたが…
elsif(/^typedef struct (.*)<.*>\s*{/) {
(.*)
でキャプチャしていたので、空白も含まれる状態に….(\w+)
に書き直すことでなんとなかなった
|
|
- xv6側もその実装だったので、去年あったマクロがずれるとかの問題も影響していそう…
# xv6側
- システムコール呼び出し側から実装していく
- 去年書いたコードは使えなさそうな気がする…..
|
|
-
現状は
cbc_read
だけgotoする様になっているcbc_read
自体は__ncode
で書かれていてIntertface化されていない
-
とりあえずSyscall Interfaceを書いてそれを各システムコールで実装する
file->read()
とかにするとかっこいいけれど、それはシステムコールディスパッチしてから記述する- syscallの実装をContextに持っておかないと行けないので、kernelのContextを最初に作らないとダメそう
# kernelのContext
- システムコールディスパッチの箇所や、例外処理などで必要そう
- context間通信みたいなのを実装すれば必要無い可能性はある
- どのタイミングで生成する?
- 仮想メモリ自体も管理したいなら、仮想メモリマネージャーを作る前で作成する必要がある
- 具体的に言うと
main.c
のinit_vmm
の実行前にするべき?
- どうやって保存する?
- 大域変数が一番楽ではあるけれど……
- kernelのContextがprocess Contextを管理する形にすると良さそう
- とりあえずmain.cに大域変数で実装してみている
- シングルトンっぽくなるのであまりやりたくはない….
|
|
init_vmm
からkmem_init2
までの一連のルーチンに鑑賞できない点が辛い- どうにかしたい気がする…..
諦める?
# 今後の方針
- kernelのcontextを実装する
- kernelのcontextを初期化する場所を決める
- 新しい変換スクリプトを書く/generateContextに手を加える
- read systemcallのinterface化
# Perlインタプリタ
- 字句解析/構文解析/AST関連を見てた
- 主に連鎖比較関係