# HG changeset patch # User e165723 # Date 1559126743 -32400 # Node ID 20d4a97ff72f8306da8b887726bc389000147c47 # Parent 954d8aee41fbfb532863ecf59d88c34acc59d701 slide fix diff -r 954d8aee41fb -r 20d4a97ff72f slide/s6/themes/blank.css --- a/slide/s6/themes/blank.css Tue May 28 15:44:03 2019 +0900 +++ b/slide/s6/themes/blank.css Wed May 29 19:45:43 2019 +0900 @@ -36,7 +36,7 @@ display: none; } .slide h2 { - font-size: 220%; + font-size: 320%; background-color: #808db5; color: white; padding: 5px; @@ -66,7 +66,7 @@ } div > ul { list-style-type: square; - font-size: 160%; + font-size: 300%; } div > ol { font-size: 160%; @@ -79,7 +79,7 @@ dt, dd, td { - font-size: 150%; + font-size: 300%; } th { font-size: 90%; diff -r 954d8aee41fb -r 20d4a97ff72f slide/scripts/prettify.css --- a/slide/scripts/prettify.css Tue May 28 15:44:03 2019 +0900 +++ b/slide/scripts/prettify.css Wed May 29 19:45:43 2019 +0900 @@ -9,7 +9,7 @@ font-family: 'Droid Sans Mono', 'Courier New', monospace; - font-size: 20px; + font-size: 30px; line-height: 28px; padding: 5px 10px; diff -r 954d8aee41fb -r 20d4a97ff72f slide/sigos.html --- a/slide/sigos.html Tue May 28 15:44:03 2019 +0900 +++ b/slide/sigos.html Wed May 29 19:45:43 2019 +0900 @@ -96,6 +96,16 @@
  • 現代の OS では拡張性と信頼性を両立させることが要求されている
  • 信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に Gears OS を設計中である
  • ノーマルレベルの計算とメタレベルの計算を切り離して記述するために Code Gear と Data Gear という単位を用いている
  • + + + + + + +
    + +

    研究目的

    + @@ -111,6 +121,16 @@
  • プログラムを記述する際、ノーマルレベルの処理の他に、メモリ管理やスレッド管理、CPU や GPU の資源管理等、記述しなければならない処理が存在する
  • これらの計算をメタ計算と呼ぶ
  • メタ計算はノーマルレベルの計算から切り離して記述したい
  • + + + + +
    + +
    + +

    メタ計算とは

    + @@ -125,7 +145,7 @@ @@ -138,7 +158,7 @@

    CbC のコード例

    @@ -192,7 +212,6 @@
  • Meta Code Gear はノーマルレベルの Code Gear の直後に遷移され、メタ計算を実行する
  • Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う
  • -
     normalCodeGear
    @@ -231,9 +250,58 @@
    +

    Context

    +
      +
    • Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている +
      enum Code {
      +  C_popSingleLinkedStack,
      +  C_pushSingleLinkedStack,
      +  C_stackTest3,
      +  C_assert3,
      +  ...
      +};
      +
      +
      context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub;
      +context->code[C_pushSingleLinkedStack]  = pushSingleLinkedStack_stub;
      +context->code[C_stackTest3] = stackTest3_stub;
      +context->code[C_assert3] = assert3_stub;
      +
      +
    • +
    + + + +
    + +
    + +

    Context

    +
      +
    • Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている
    • +
    • Data Gear のリストも enum で管理されている
    • +
    • これは引数格納用の Data Gear の番号である +
      enum DataType {
      +  D_Code,
      +  D_SingleLinkedStack,
      +  D_Stack,
      +  D_TaskManager,
      +  D_Worker,
      +  ...
      +  };
      +
      +
    • +
    + + + +
    + +
    +

    Interface

    • Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される
    • +
    • Interface は GearsOS でのモジュール化の仕組み
    • Interface は使用される Data Gear の定義と、それに対する Code Gear の集合である
    • Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して行われる
    @@ -244,6 +312,83 @@
    +

    Interface の定義

    +
      +
    • Stack の Interface の例である
    • +
    • typedef struct Interface 名で記述する
    • +
    • Impl は実際に実装した際のデータ構造の型になる
    • +
    + +
    typedef struct Stack<Impl> {
    +    union Data* stack;
    +    union Data* data;
    +    __code next(...);
    +    __code whenEmpty(...);
    +
    +    __code clear(Impl* stack, __code next(...));
    +    __code push(Impl* stack, union Data* data, __code next(...));
    +    __code pop(Impl* stack, __code next(union Data* ...));
    +    __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
    +
    +}
    +
    + + +
    + +
    + +

    Interface の定義

    +
      +
    • Data Gear は 操作する Data Gear と +操作に必要な全ての Data Gear Gear が記述されている
    • +
    • __code で記述されているものが操作の Code Gear である
    • +
    + +
    typedef struct Stack<Impl> {
    +    union Data* stack;
    +    union Data* data;
    +    __code next(...);
    +    __code whenEmpty(...);
    +
    +    __code clear(Impl* stack, __code next(...));
    +    __code push(Impl* stack, union Data* data, __code next(...));
    +    __code pop(Impl* stack, __code next(union Data* ...));
    +    __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
    +
    +}
    +
    + + +
    + +
    + +

    Interface の実装の記述

    +
      +
    • ソースコードは Interface の実装の初期化のコードである
    • +
    • 操作の Code Gear には実装した Code Gear の番号が代入されるが、ここを入れ替えることで、複数の実装を持つことができる +
      Stack* createSingleLinkedStack(struct Context* context) {
      +  struct Stack* stack = new Stack();
      +  struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
      +  stack->stack = (union Data*)singleLinkedStack;
      +  singleLinkedStack->top = NULL;
      +  stack->push = C_pushSingleLinkedStack;
      +  stack->pop  = C_popSingleLinkedStack;
      +  stack->isEmpty = C_isEmptySingleLinkedStack;
      +  stack->clear = C_clearSingleLinkedStack;
      +  return stack;
      +}   
      +
      +
    • +
    + + + +
    + +
    +

    xv6-rpi の CbC 対応

    • オリジナルの xv6 は x86 アーキテクチャで実装されたものだが、xv6-rpi は Raspberry Pi 用に実装されたものである
    • diff -r 954d8aee41fb -r 20d4a97ff72f slide/sigos.md --- a/slide/sigos.md Tue May 28 15:44:03 2019 +0900 +++ b/slide/sigos.md Wed May 29 19:45:43 2019 +0900 @@ -7,6 +7,8 @@ * 現代の OS では拡張性と信頼性を両立させることが要求されている * 信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に Gears OS を設計中である * ノーマルレベルの計算とメタレベルの計算を切り離して記述するために Code Gear と Data Gear という単位を用いている + +## 研究目的 * Gears OS は Continuation based C(CbC) によってアプリケーションと OS そのものを記述する * 本研究では、CbC を用いた Gears OS の実装の前段階として xv6 での実装を目標とする @@ -14,18 +16,20 @@ * プログラムを記述する際、ノーマルレベルの処理の他に、メモリ管理やスレッド管理、CPU や GPU の資源管理等、記述しなければならない処理が存在する * これらの計算をメタ計算と呼ぶ * メタ計算はノーマルレベルの計算から切り離して記述したい + +## メタ計算とは * そのためには処理を細かく分割する必要があるが、関数やクラスなどの単位は容易に分割できない * そこで当研究室ではメタ計算を柔軟に記述するためのプログラミング言語の単位として Code Gear、Data Gear という単位を提案している ## Continuatuin based C * Continuation based C (CbC) はこの Code Gear 処理の単位としてプログラミング言語として開発している。 * Code Gear は 関数呼び出し時の環境を使わずに次の Code Gear へと goto 文によって遷移する -* この goto 文による遷移を軽量継続と呼ぶ。 +* この goto 文による遷移を軽量継続と呼ぶ * 継続を用いることによって状態遷移ベースでのプログラミングが可能である * CbC は C と互換性のある言語なので、C の関数も呼び出すことができる ## CbC のコード例 -* CbC では Code Gear は *__code* Code Gear 名 (引数) の形で記述される +* CbC では Code Gear は \_\_code Code Gear 名 (引数) の形で記述される * Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない * goto の後に Code Gear 名と引数を並べて、次の Code Gear の遷移を記述する @@ -55,7 +59,6 @@ * Gears OS ではメタ計算を Meta Code Gear、Meta Data Gear で表現する * Meta Code Gear はノーマルレベルの Code Gear の直後に遷移され、メタ計算を実行する * Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う -
       normalCodeGear
      @@ -68,17 +71,105 @@
    - + +## Context +* Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている +``` +enum Code { + C_popSingleLinkedStack, + C_pushSingleLinkedStack, + C_stackTest3, + C_assert3, + ... +}; +``` +``` +context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub; +context->code[C_pushSingleLinkedStack] = pushSingleLinkedStack_stub; +context->code[C_stackTest3] = stackTest3_stub; +context->code[C_assert3] = assert3_stub; +``` + +## Context +* Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている +* Data Gear のリストも enum で管理されている +* これは引数格納用の Data Gear の番号である +``` +enum DataType { + D_Code, + D_SingleLinkedStack, + D_Stack, + D_TaskManager, + D_Worker, + ... + }; +``` ## Interface * Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される +* Interface は GearsOS でのモジュール化の仕組み * Interface は使用される Data Gear の定義と、それに対する Code Gear の集合である * Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して行われる +## Interface の定義 +* Stack の Interface の例である +* typedef struct Interface 名で記述する +* Impl は実際に実装した際のデータ構造の型になる + +``` +typedef struct Stack { + union Data* stack; + union Data* data; + __code next(...); + __code whenEmpty(...); + + __code clear(Impl* stack, __code next(...)); + __code push(Impl* stack, union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + +} +``` +## Interface の定義 +* Data Gear は 操作する Data Gear と +操作に必要な全ての Data Gear Gear が記述されている +* \_\_code で記述されているものが操作の Code Gear である + +``` +typedef struct Stack { + union Data* stack; + union Data* data; + __code next(...); + __code whenEmpty(...); + + __code clear(Impl* stack, __code next(...)); + __code push(Impl* stack, union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + +} +``` +## Interface の実装の記述 +* ソースコードは Interface の実装の初期化のコードである +* 操作の Code Gear には実装した Code Gear の番号が代入されるが、ここを入れ替えることで、複数の実装を持つことができる +``` +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = new Stack(); + struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack(); + stack->stack = (union Data*)singleLinkedStack; + singleLinkedStack->top = NULL; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->clear = C_clearSingleLinkedStack; + return stack; +} +``` + ## xv6-rpi の CbC 対応 * オリジナルの xv6 は x86 アーキテクチャで実装されたものだが、xv6-rpi は Raspberry Pi 用に実装されたものである * xv6-rpi を CbC で書き換えるために、GCC 上で実装した CbC コンパイラを ARM 向けに build し xv6-rpi をコンパイルした diff -r 954d8aee41fb -r 20d4a97ff72f slide/sigos.pdf.html --- a/slide/sigos.pdf.html Tue May 28 15:44:03 2019 +0900 +++ b/slide/sigos.pdf.html Wed May 29 19:45:43 2019 +0900 @@ -80,6 +80,16 @@
  • 現代の OS では拡張性と信頼性を両立させることが要求されている
  • 信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に Gears OS を設計中である
  • ノーマルレベルの計算とメタレベルの計算を切り離して記述するために Code Gear と Data Gear という単位を用いている
  • + + + + +
    + +
    + +

    研究目的

    +
    • Gears OS は Continuation based C(CbC) によってアプリケーションと OS そのものを記述する
    • 本研究では、CbC を用いた Gears OS の実装の前段階として xv6 での実装を目標とする
    @@ -95,6 +105,16 @@
  • プログラムを記述する際、ノーマルレベルの処理の他に、メモリ管理やスレッド管理、CPU や GPU の資源管理等、記述しなければならない処理が存在する
  • これらの計算をメタ計算と呼ぶ
  • メタ計算はノーマルレベルの計算から切り離して記述したい
  • + + + + +
    + +
    + +

    メタ計算とは

    +
    • そのためには処理を細かく分割する必要があるが、関数やクラスなどの単位は容易に分割できない
    • そこで当研究室ではメタ計算を柔軟に記述するためのプログラミング言語の単位として Code Gear、Data Gear という単位を提案している
    @@ -109,7 +129,7 @@
    • Continuation based C (CbC) はこの Code Gear 処理の単位としてプログラミング言語として開発している。
    • Code Gear は 関数呼び出し時の環境を使わずに次の Code Gear へと goto 文によって遷移する
    • -
    • この goto 文による遷移を軽量継続と呼ぶ。
    • +
    • この goto 文による遷移を軽量継続と呼ぶ
    • 継続を用いることによって状態遷移ベースでのプログラミングが可能である
    • CbC は C と互換性のある言語なので、C の関数も呼び出すことができる
    @@ -122,7 +142,7 @@

    CbC のコード例

      -
    • CbC では Code Gear は __code Code Gear 名 (引数) の形で記述される
    • +
    • CbC では Code Gear は __code Code Gear 名 (引数) の形で記述される
    • Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない
    • goto の後に Code Gear 名と引数を並べて、次の Code Gear の遷移を記述する
    @@ -176,7 +196,6 @@
  • Meta Code Gear はノーマルレベルの Code Gear の直後に遷移され、メタ計算を実行する
  • Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う
  • -
     normalCodeGear
    @@ -215,9 +234,58 @@
    +

    Context

    +
      +
    • Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている +
      enum Code {
      +  C_popSingleLinkedStack,
      +  C_pushSingleLinkedStack,
      +  C_stackTest3,
      +  C_assert3,
      +  ...
      +};
      +
      +
      context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub;
      +context->code[C_pushSingleLinkedStack]  = pushSingleLinkedStack_stub;
      +context->code[C_stackTest3] = stackTest3_stub;
      +context->code[C_assert3] = assert3_stub;
      +
      +
    • +
    + + + +
    + +
    + +

    Context

    +
      +
    • Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている
    • +
    • Data Gear のリストも enum で管理されている
    • +
    • これは引数格納用の Data Gear の番号である +
      enum DataType {
      +  D_Code,
      +  D_SingleLinkedStack,
      +  D_Stack,
      +  D_TaskManager,
      +  D_Worker,
      +  ...
      +  };
      +
      +
    • +
    + + + +
    + +
    +

    Interface

    • Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される
    • +
    • Interface は GearsOS でのモジュール化の仕組み
    • Interface は使用される Data Gear の定義と、それに対する Code Gear の集合である
    • Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して行われる
    @@ -228,6 +296,83 @@
    +

    Interface の定義

    +
      +
    • Stack の Interface の例である
    • +
    • typedef struct Interface 名で記述する
    • +
    • Impl は実際に実装した際のデータ構造の型になる
    • +
    + +
    typedef struct Stack<Impl> {
    +    union Data* stack;
    +    union Data* data;
    +    __code next(...);
    +    __code whenEmpty(...);
    +
    +    __code clear(Impl* stack, __code next(...));
    +    __code push(Impl* stack, union Data* data, __code next(...));
    +    __code pop(Impl* stack, __code next(union Data* ...));
    +    __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
    +
    +}
    +
    + + +
    + +
    + +

    Interface の定義

    +
      +
    • Data Gear は 操作する Data Gear と +操作に必要な全ての Data Gear Gear が記述されている
    • +
    • __code で記述されているものが操作の Code Gear である
    • +
    + +
    typedef struct Stack<Impl> {
    +    union Data* stack;
    +    union Data* data;
    +    __code next(...);
    +    __code whenEmpty(...);
    +
    +    __code clear(Impl* stack, __code next(...));
    +    __code push(Impl* stack, union Data* data, __code next(...));
    +    __code pop(Impl* stack, __code next(union Data* ...));
    +    __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
    +
    +}
    +
    + + +
    + +
    + +

    Interface の実装の記述

    +
      +
    • ソースコードは Interface の実装の初期化のコードである
    • +
    • 操作の Code Gear には実装した Code Gear の番号が代入されるが、ここを入れ替えることで、複数の実装を持つことができる +
      Stack* createSingleLinkedStack(struct Context* context) {
      +  struct Stack* stack = new Stack();
      +  struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack();
      +  stack->stack = (union Data*)singleLinkedStack;
      +  singleLinkedStack->top = NULL;
      +  stack->push = C_pushSingleLinkedStack;
      +  stack->pop  = C_popSingleLinkedStack;
      +  stack->isEmpty = C_isEmptySingleLinkedStack;
      +  stack->clear = C_clearSingleLinkedStack;
      +  return stack;
      +}   
      +
      +
    • +
    + + + +
    + +
    +

    xv6-rpi の CbC 対応

    • オリジナルの xv6 は x86 アーキテクチャで実装されたものだが、xv6-rpi は Raspberry Pi 用に実装されたものである