Mercurial > hg > Papers > 2023 > nana-sigos
changeset 6:c6bea5a028fd
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 17 Apr 2023 18:28:26 +0900 |
parents | 890dcb9acc8b |
children | 319a58e580e4 |
files | code-mangement.ind main.tex |
diffstat | 2 files changed, 90 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/code-mangement.ind Mon Apr 17 15:39:57 2023 +0900 +++ b/code-mangement.ind Mon Apr 17 18:28:26 2023 +0900 @@ -1,6 +1,35 @@ -title: Gears OSの CodeGear Management --author: 河野真治 +-author: 仲吉菜々子 and 河野真治 + +--abstract: + +GearsOSではすべてのプログラムはKernelやdriverを含めて CodeGear +で書かれている。これらは、CodeGear のSystem DBに格納される +べきである。Microwre OS9でもmoduleという形でメモリに展開さ +れていた。CodeGearの集合で一つのアプリやサービスが作られる。 +このCodeGearnの組み合わせを指定する仕組みが必要である。また、 +CodeGear を実行時にloadする機構を作ることにより、現在、clnag +のlinkerで行っている作業抜きでGearsOSを構成できる。これによ +り、GearsOSのbuildを簡単にすることができる。高速化が必要な +場合は、複数のCodeGearをまとめて最適化して、一つのCodeGearn +にする。しかし、実行時のメタ計算がが必要な場合は、それよう +のhookを用意する必要がある。これの仕組みについて考察する。 + +--abstract-e: + +In GearsOS, all programs, including kernels and drivers, are +written in CodeGear. These should be stored in the System DB +of CodeGear. In Microwre OS9, they were deployed in memory +as modules. An application or service is created using a set +of CodeGear. A mechanism is needed to specify the combination +of CodeGear. Additionally, by creating a mechanism to load +CodeGear at runtime, GearsOS can be built without the work +currently done by the clnag linker. This simplifies the process +of building GearsOS. When optimization is necessary, multiple +CodeGear can be combined and optimized to create a single CodeGear. +However, if runtime metacalculation is necessary, a hook must +be provided for it. --Gears OSによる信頼できるサービス @@ -11,15 +40,19 @@ Gears OSでは実行単位として codeGear、データ単位として dataGear を使う。さらに、これらは Monad のようにメタ codeGeearやメタdataGearを持っている。 -Gears OSでの検証は、Agdaを使った GearsAgdaを用いる。これらの実行と並列実行は、 +Gears OSでの検証は、Agda\cite{Agda,AgdaWiki}を使った GearsAgdaを用いる。これらの実行と並列実行は、 GearsAgdaに対して定義される。当然、すべてのGearsAgdaのcodeGearは、Gears OSに 登録されることになる。 +OSでの証明よる検証はいろいろ行なわれているが、Haskellに近い形式に変換することが多い +\cite{Klein:2014:CFV:2584468.2560537,Chen:2015:UCH:2815400.2815402,Yang:2010:SLI:1806596.1806610}。 +Gears OSでは、GearsAgda で直接に記述できる点が新しい。 + この論文では、Gears OSのcodeGearの管理方法について考察する。 --Normal and Meta computation -Gears OSの基本は、CbC (Continuation based C)であり、input interfaceとoutput interfaceを有限な処理で +Gears OSの基本は、CbC (Continuation based C)\cite{cbc-github}であり、input interfaceとoutput interfaceを有限な処理で 結ぶものになっている。これは、コンパイラの基本ブロックに大体相当する。これはさらに、GearsAgdaの Agdaで記述された invariant あるいは、表示的意味論と直結している。 @@ -38,11 +71,11 @@ 時刻に対するアクセスである。 OS側からみると、これは詳細のない単なるコードに見える。実行の詳細、つまり、実行に関係する -すべての dataGear 、すべてのcodeGearは、プロセスに相当する Context metaDataGearに格納される。 +すべての dataGear 、すべてのcodeGearは、プロセスに相当する Context metaDataGear(図\ref{Gears OS})に格納される。 つまり、OSからみた codeGearの実行は、 - Contextから詳細を取り出すmeta codeGearの番号から、codeGearを選ぶ + meta codeGearの番号から、codeGearを選ぶ それを実行し、continuation としてshcedulerを指定する これを CPU worker 毎に実行する @@ -71,6 +104,8 @@ もし、codeGearの実行の正しさが証明されているなら、メモリ空間を切り替える必然性はない。 実際、Kernel 内や Realtime Monitor では切り替えない方が普通である。 +<center><img src="fig/gears_structure.pdf" alt="Gears OS"></center> + --証明付きのコード GearsAgdaで記述されていれば、codeGearやdataGearは証明を持つ。これらは単なる型なので実行時には @@ -115,7 +150,7 @@ 割り込まれることも意味している。 GearsAgda で処理された項は、ContextのdataGearに格納される。また、GearsAgdaのcodeGearは、 -Contextのcode tableに格納される。どちらも、メモリ的には番号で管理されることになる。 +Contextのcode table(図\ref{code table})に格納される。どちらも、メモリ的には番号で管理されることになる。 GearsAgda の Context は、その意味で、プロセスのメモリ空間そのものを抽象化したものになっている。 @@ -123,6 +158,8 @@ その意味は、CbCと GearsAgda で若干異なる。CbCでの実装は、GearsAgdaでの実装の持つ 性質を保存する必要がある。 +<center><img src="fig/codetable.pdf" alt="code table"></center> + --Contextを通した dataGearとcodeGearの連携 Gears OSでは、Context はCの構造体であり、一つのContextで使用するdataGearとcodeGearは、そこに格納される。 @@ -154,6 +191,43 @@ Context を用いた並行実行の場合は、Context上での管理の問題が生じる。 +--code table + +contextの初期化の中で、code table に実際の codeGear stub へのポインタが初期化される。 + + context->code[C_add] = add_stub; + context->code[C_checkAndSetAtomicReference] + = checkAndSetAtomicReference_stub; + context->code[C_clearSingleLinkedQueue] = clearSingleLinkedQueue_stub; + context->code[C_clearSynchronizedQueue] = clearSynchronizedQueue_stub; + context->code[C_code1] = code1_stub; + context->code[C_createTask1] = createTask1_stub; + context->code[C_createTask2] = createTask2_stub; + context->code[C_decrementTaskCountTaskManagerImpl] + = decrementTaskCountTaskManagerImpl_stub; + context->code[C_exit_code] = exit_code_stub; + context->code[C_getTaskCPUWorker] = getTaskCPUWorker_stub; + context->code[C_incrementTaskCountTaskManagerImpl] + = incrementTaskCountTaskManagerImpl_stub; + +interfaceの初期化の中で、この番号が interfaceを表す dataGearに格納される。 + + Tree* createRedBlackTree(struct Context* context) { + struct Tree* tree = &ALLOCATE(context, Tree)->Tree; + struct RedBlackTree* redBlackTree + = &ALLOCATE(context, RedBlackTree)->RedBlackTree; + tree->tree = (union Data*)redBlackTree; + redBlackTree->root = NULL; + redBlackTree->nodeStack = createSingleLinkedStack(context); + tree->put = C_putRedBlackTree; + tree->get = C_getRedBlackTree; + tree->remove = C_removeRedBlackTree; + return tree; + } + +この辺の構造は、GearsAgda 側では簡素化されている。実際、pointer を直接操作しないとかも、厳密に守る必要はなく、 +GearsAgda と CbC での実装が平行していれば問題はない。 + --codeGearのlinkage Gears OSのあらゆるコードは、codeGear DBのコードの組み合わせになる。しかし、そのためには、 @@ -162,7 +236,9 @@ 現状では、これは stubとしてコンパイル時に生成される。 - __code checkAndSetAtomicReference(struct AtomicReference* atomic, union Data** ptr, union Data* oldData, union Data* newData, __code next(...), __code fail(...)) { + __code checkAndSetAtomicReference(struct AtomicReference* atomic, + union Data** ptr, union Data* oldData, union Data* newData, __code next(...), + __code fail(...)) { if (__sync_bool_compare_and_swap(ptr, oldData, newData)) { goto next(...); } @@ -182,13 +258,15 @@ } Atomic; __code checkAndSetAtomicReference_stub(struct Context* context) { - AtomicReference* atomic = (AtomicReference*)GearImpl(context, Atomic, atomic); + AtomicReference* atomic = (AtomicReference*) + GearImpl(context, Atomic, atomic); Data** ptr = Gearef(context, Atomic)->ptr; Data* oldData = Gearef(context, Atomic)->oldData; Data* newData = Gearef(context, Atomic)->newData; enum Code next = Gearef(context, Atomic)->next; enum Code fail = Gearef(context, Atomic)->fail; - goto checkAndSetAtomicReference(context, atomic, ptr, oldData, newData, next, fail); + goto checkAndSetAtomicReference(context, atomic, + ptr, oldData, newData, next, fail); } これらは単一のGears OS内で整合する必要がある。実際には、これらは、stubが参照する Context内のoffsetにすぎない。 @@ -221,7 +299,7 @@ --boot codeGear -今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{}と同じで、ファイルシステムを +今の実装では、UEFIから Gears OSが読み出される。Gears OS自体は、x.v6\cite{xv6rpi}と同じで、ファイルシステムを 含む一体の binary になっている。 codeGear DBを実装すれば、かなりの部分を後からロードすることが可能になる。