26
CIL でででででで OS ででででででででで An executing method of a OS kernel represented in the CIL 957◆KhjEefLZMk

CIL で表現された OS カーネルの実行方法

  • Upload
    aleta

  • View
    49

  • Download
    0

Embed Size (px)

DESCRIPTION

CIL で表現された OS カーネルの実行方法. An executing method of a OS kernel represented in the CIL. 957◆KhjEefLZMk. 研究概要. PC/AT 向け汎用オペレーティングシステムを開発 CLI: Common Language Infrastructure を用いる。 Microsoft .NET として有名 CLI で開発するし、利用もする。 カーネルの記述は C# 言語を主に使用 記述しやすい メモリ操作と管理が安全 中間言語 (CIL) にコンパイルされる. 既存の問題. - PowerPoint PPT Presentation

Citation preview

Page 1: CIL で表現された OS カーネルの実行方法

CIL で表現された OS カーネルの実行方法

An executing method of a OS kernel represented in the CIL

957◆KhjEefLZMk

Page 2: CIL で表現された OS カーネルの実行方法

2

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発研究概要

PC/AT 向け汎用オペレーティングシステムを開発◆ CLI: Common Language Infrastructure を用いる。

Microsoft .NET として有名◆ CLI で開発するし、利用もする。

カーネルの記述は C# 言語を主に使用◆ 記述しやすい◆ メモリ操作と管理が安全

◆ 中間言語 (CIL) にコンパイルされる

Page 3: CIL で表現された OS カーネルの実行方法

3

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発既存の問題

CLI (C#) や JVM (Java) は、アプリケーションでは使われている。

CLI には、システムソフトウェアが備えるべき要件を満たすための規格が十分に定義されている。◆ 実用的な実行速度◆ セキュリティ

しかし、システムソフトウェアには適用されていない。◆ OS は非 CLI/JVM で作られている。◆ 中間言語という特徴がカーネルには適用しにくくしている。

Page 4: CIL で表現された OS カーネルの実行方法

4

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発研究目的

オペレーティングシステムに CLI の特徴を活かし、安全な基盤ソフトウェアを実現する。

そのために、 CLI でカーネルを構築する手法を提案し、動作を実証することを目的とする。

Page 5: CIL で表現された OS カーネルの実行方法

5

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発類似研究

C/C++ Java CLI (.NET)

Corporate Windows Java OS Singularity

Non-corporate Linux JNode, JX, etc.

(nothing)

CLI を用いる研究例は非常に少ない

起動時にインタープリタと組み合わせるものはない

Page 6: CIL で表現された OS カーネルの実行方法

オペレーティングシステム設計

Architecture and Desgin

Page 7: CIL で表現された OS カーネルの実行方法

7

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発基本方針

CLI の特長を生かす(従来不可能なことを試す)◆ カーネルは CLI で表現する◆ システム全体も CLI 準拠にする

既存資産を最大限生かす◆ Mono クラスライブラリ(標準ライブラリに相当)◆ FreeType フォントエンジン

Page 8: CIL で表現された OS カーネルの実行方法

8

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発ソフトウェア構成

特徴:ふたつのカーネルがリレーする

レガシー・カーネル◆ C++ で記述 → 機械語◆ CIL インタープリタを含む◆ i.e. 巨大ブートストラップ・ローダ

マネージ・カーネル◆ CLI 言語 (C# など ) → ほぼ中間言語◆ 完全なカーネルプログラム◆ CIL コンパイラを含む

マネージカーネル CIL( )

レガシーカーネル C+( +言語)

アセンブリローダ

CIL コンパイラ

CIL インタープリタ

実行

などコンパイル

Page 9: CIL で表現された OS カーネルの実行方法

9

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発ブートシーケンス

最終的には C# で書かれたマネージカーネルのみ残る

ブートローダ ブートローダ

レガシーカーネル レガシーカーネル

マネージカーネル

カーネルブリッジ カーネルブリッジ

ブートローダ

レガシーカーネル

消滅したプログラム

実行中のプログラム

マネージカーネル

システムライブラリシステムライブラリ

動作中のライブラリ

読み込まれたデータ

カーネルブリッジ

ブートローダ

レガシーカーネル

マネージカーネル

システムライブラリ

フォントレンダラ

シェル

起動

Page 10: CIL で表現された OS カーネルの実行方法

10

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発提案手法の利点

システム全体を CLI で表現できる

起動時の初期化処理から CLI を活用できる◆ 初期化処理も C# で記述できる◆ Mono クラスライブラリを使える

ハードウェアに依存する箇所が少ない◆ インタープリタ◆ MMS: Memory Management System を使用しない

Page 11: CIL で表現された OS カーネルの実行方法

提案手法の実装

Implementation of our proposed method

Page 12: CIL で表現された OS カーネルの実行方法

12

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発手法概要

重要な手続きは二つ◆ メタデータ

メタデータは CLI の核になる要素 コンパイルでも利用する

◆ コンパイル カーネルとして必要になる処理

説明の順序1. 起動までの流れ2. メタデータ構築手順3. コンパイラと JIT コンパイル

Page 13: CIL で表現された OS カーネルの実行方法

13

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発初期状態

Unmanaged C+空間( +用)

メタデータ CIL インタープリタ

起動直後のメモリ内の要素◆ マネージカーネルのメタデータ◆ CIL インタープリタ

レガシーカーネルから自然にアクセス可能

Page 14: CIL で表現された OS カーネルの実行方法

14

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発提案手法の処理概要

メタデータを構築

機械語を生成

Unmanaged C+空間( +用)

メタデータ

CIL インタープリタ

Managed CL空間( I 用)

メタデータアセンブリローダ

実行

構築

Unmanaged C+空間( +用)

CIL インタープリタ

Managed CL空間( I 用)

メタデータ

CIL コンパイラ

実行

出力機械語

メタデータ入力

Page 15: CIL で表現された OS カーネルの実行方法

15

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発メタデータとは

プログラムが扱うデータに関するデータ◆ 型の情報(種類、基本クラスなど)◆ フィールドの情報

型、位置とサイズなど◆ メソッドの情報

戻り値、パラメタなど コードが格納されている場所

◆ 外部で定義されるシンボルとのリンク

CLI のメタデータは、元のソースコードが復元できるほどの情報量を持つ

“ リフレクション API” を通して公開される

Page 16: CIL で表現された OS カーネルの実行方法

16

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発メタデータの構築手順

プログラム実行にメタデータが必要(なときがある)◆ メタデータを CLI プログラムでロードできない

仮のメタデータと真のメタデータの切り替え

ローダ

普通のプログラム

ランタイム

プログラム

アセンブリ

アセンブリ

アセンブリ

Page 17: CIL で表現された OS カーネルの実行方法

17

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発型オブジェクトの様子

int 100myInstance = new MyClassについての型オブジェクト

移行前はアセンブリは参照不可

移行後はアセンブリを参照して完全なメタデータを利用可能

<<struct>>100 : Int32

myInstance : MyClass

Int32 : PseudoTypeMyClass : PseudoType

PseudoType : PseudoType

<<struct>>100 : Int32

myInstance : MyClass

Int32 : PrimitiveTypeMyClass : ClassType

cscorlib : Assembly mscorlib : Assembly

PrimitiveType : ClassTypeClassType : ClassType

Page 18: CIL で表現された OS カーネルの実行方法

18

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発コンパイル

中間言語のコンパイラを機械語に翻訳する処理◆ コンパイラの動作から逐次実行を無くすことが目的

スタックマシンからレジスタマシンへの単純な翻訳(ただし表の命令をのぞく)

newobj AllocateObjectImpl

newarr AllocateSzArrayImpl

ldstr LoadStringImpl

box BoxImpl

isinst IsInstImpl

castclass CastClassImpl

call PrepareCode

callvirt FindActualMethod

callvirt FindActualMethodForInterface

Page 19: CIL で表現された OS カーネルの実行方法

19

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発JITコンパイル

Caller メソッド(発呼側)におけるCallee メソッド(被呼側)の呼び出し部分

Caller ランタイム

PrepareCode(method_id)

コンパイラ

コード

Compile()

機械語コード

生成

Callee()

スタブ

Stub()

書き換え

分岐アドレ

Page 20: CIL で表現された OS カーネルの実行方法

実験

Experiments

Page 21: CIL で表現された OS カーネルの実行方法

21

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発起動実験

起動時の画面 テキストモード(右図)とグラフィックモード(左図)

( OS のモードではなくグラフィックアダプタの設定)

開発した OS の名称を CooS (クース)という。

Page 22: CIL で表現された OS カーネルの実行方法

22

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発ファイルシステムなどの試験

ファイル一覧を出力するプログラム (ls)

このプログラムを Windows 上でコンパイル・動作させ、動作を確認。

動作確認した実行可能ファイル (ls.exe) を CooS にコピーして実行して、動作することを確認した。

◆ クロスプラットフォーム◆ ファイルシステム互換

using System;using System.IO;

class ls {  static void Main(string[] args) {   DirectoryInfo dir;

if(args.Length==0) {   dir = new DirectoryInfo(

Directory.GetCurrentDirectory());} else {   dir = new DirectoryInfo(args[0]);}foreach(FileSystemInfo fsi in dir.GetFileSystemInfos()) {   Console.Write("{0,-32} ", fsi.Name);   if(fsi is FileInfo) {

FileInfo fi = (FileInfo)fsi;Console.Write("{0,10} B", fi.Length);

   } else {Console.Write("{0,10} -","");

   }   Console.WriteLine();}

  }}

Page 23: CIL で表現された OS カーネルの実行方法

23

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発フォントレンダラの試験

Windows と CooS の両方でFreeType ライブラリを動作

◆ 高品位フォントエンジン

Page 24: CIL で表現された OS カーネルの実行方法

24

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発デバイスドライバの記述

DMA コントローラの構築子

DMA コントローラに割り当てられている IO ポートを生成しているのが分かる

初期化メソッド

各ポートを通して DMA を制御している

private DMAController(ushort cadr0, ushort cadr1, ushort cadr2, ushort cadr3,ushort ccnt0, ushort ccnt1, ushort ccnt2, ushort ccnt3,ushort psts, ushort pcmd, ushort preq, ushort psmask,ushort pmode, ushort pcbpf, ushort ptmp, ushort pmclr,ushort pcmask, ushort pamask)

{this.cur_address[0] = new IOPort1(cadr0);this.cur_address[1] = new IOPort1(cadr1);this.cur_address[2] = new IOPort1(cadr2);this.cur_address[3] = new IOPort1(cadr3);this.cur_counter[0] = new IOPort1(ccnt0);this.cur_counter[1] = new IOPort1(ccnt1);this.cur_counter[2] = new IOPort1(ccnt2);this.cur_counter[3] = new IOPort1(ccnt3);this.status = new IOPort1(psts);this.command = new IOPort1(pcmd);this.request = new IOPort1(preq);this.single_mask = new IOPort1(psmask);this.mode = new IOPort1(pmode);this.clear_byte_ptr_flipflop = new IOPort1(pcbpf);this.temporary = new IOPort1(ptmp);this.master_clear = new IOPort1(pmclr);this.clear_mask = new IOPort1(pcmask);this.all_mask = new IOPort1(pamask);

}

private void Initialize(byte mode, byte mask) {this.master_clear.Write(0x00); // master clear (reset)this.command.Write(0x00);    // cmd reg.this.mode.Write(mode);      // mode reg.this.all_mask.Write(mask);     // all mask reg.

}

Page 25: CIL で表現された OS カーネルの実行方法

25

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発まとめ

CLI をカーネルで用いるための手法を提案した。◆ レガシーカーネルとマネージカーネルという二つのカーネルを

組み合わせて動作させる

提案手法を実装した OS を実装し、実際に動作させて評価した。◆ Windows とのクラスプラットフォーム

ファイルシステム FreeType ライブラリ

◆ デバイスドライバの記述

Page 26: CIL で表現された OS カーネルの実行方法

26

CLIを実

装す

る次

世代

オペ

レー

ティ

ング

シス

テム

の開

発今後の展望

現状では、一部メソッドの実行を依然としてインタープリタに頼っている。(それらメソッドのコールグラフの解析で解決できると考えられる。)

インタープリタが動作する部分を予め終わらせておく(ビルドプロセスの一部として逐次実行を入れる)