Skip to content
oraccha edited this page Jan 14, 2013 · 1 revision

OSなどシステム系の先進的な研究を行なうにはすべてをフルスクラッチで作っていたらいくら時間があっても足りない.アイデアのコアとなる部分をすぐに検証してみたい.利用できるコードは既存のものを再利用できるようなフレームワークを提供しようというのが,Univ. of UtahのOSKitプロジェクト.

  • [http://www.cs.utah.edu/flux/oskit/ 本家]

    • [ftp://flux.cs.utah.edu/flux/oskit/mail/html/oskit-users/index.html ML アーカイブ]
    • このグループはCMUからMachプロジェクトを引き継いで,Mach4やLitesなどをやっていたところである.
    • 2002-09-13: IA32 と StrongARM 用のコードがある.最近 [http://www.cs.utah.edu/flux/oskit/oskit-alpha.html Alpha 用のパッチ]もリリースされたみたい.
  • [http://savannah.nongnu.org/projects/oskit/ Unofficial OSKit sources]

  • GnuFans:Mach/OskitPatches

  • [http://www.ddavies.net/oskit-entropy/ OSKit Entropy Pool Hacks]

  • [http://www.media.osaka-cu.ac.jp/~k-abe/oskit/ OSKitで遊ぼう] . PortableThreadLibrary の作者でもある安倍広多氏のページ.VMWare + OSKit.

彼らは FlukeMach ベースで開発していたが,Mach は大きく,柔軟性に欠けるため,思うように変更ができなかった.その経験から OSKit の開発がスタートしたらしい.OSKit はフルスクラッチではなく,既存OSのコードを利用するアプローチを取ったが,Fluke に特化するのではなく汎用的なものになるよう設計された.

既存のコードはglue(糊)コードでラップされ,各コンポーネントCOMインタフェースを提供する.

  • COMインタフェースを利用するあたりはMMLiteでも同じ.

x86版SPINでは,FreeBSDのデバイスドライバを使っているし,VINONetBSDのデバイスドライバ,ブートストラップ仮想記憶の低レベル支援のコードを利用している.この手のad hocな再利用はよく行われることだと思う.

ExokernelSPINVINOなどのカーネルはAPレベルでOSの振舞いを変更することができる.しかし,その拡張性はカーネルコアの機能に制限されるため,定義可能なポリシセットが限定される.そこで,OSKitではOSのコアは提供せず,OSを簡単に作るためのコンポーネントセットを提供する.

というのはわかるが,結局作れるのは,UnixPOSIXなOSに限定される気がする.

Mach4 には Linux のデバイスドライバを無修正で組み込むためのフレームワークが実装されていたみたい.その辺も OSKit 誕生の背景にあるのかな?

  • [http://citeseer.nj.nec.com/goel96linux.html Linux Device Driver Emulation in Mach] (ReseachIndex) . Mach 4.0(UK02p21) に Linux 1.3.35 のデバイスドライバを無修正で組み込むためのエミュレーション機構.
    • FDD,IDE HDD,SCSI HDD,[NIC]SCSI ホストアダプタ(ISAx30,PCIx4),合計 53 のデバイスドライバが動作した.
    • エミュレーションによる遅延の増加を測定したところ,小さいパケット(60byte)の受信処理で 2μs,ISA SCSI の 16k byte の書込みで 197 μs とオーバヘッドは十分小さく実装できた.実装規模は C で 2,000 行程度.
    • Linux は静的,動的にドライバをリンクできるが,Mach は静的リンクしかサポートしていない.Linux ではデバイスごとに異なるカーネルとのインタフェース(手続き呼出し)を持つ.Mach はすべてのデバイスで共通のインタフェース(メッセージ通信)を持つ.このようなドライバインタフェースの変換の他に,デバイスをプローブするときタイマ割込みによるタイムアウトを利用するか遅延ループを利用するか,アドレスマッピング(セグメントレジスタの使い方,Linux ではカーネル仮想アドレスと物理アドレスを 1to1 にマッピングするなど),ブロックサイズ(Linux は多くは 1k で CD-ROM は 2k.Mach はすべて 4k),同期方式(I/Oリクエストが同期か非同期か.割込み禁止に spl を使うかどうか)などの違いを解決する必要がある.

OSKitを使った例としては,次のようなものがある.

  • Fluke

  • ML/OS . ML/NJ を動かす.ML/NJ はスタックをまったく使わない言語処理系だったはず.一方で通常の OS はスタックの利用を前提としている.このように言語処理系のセマンティクスが OS と矛盾する可能性がある.そこで言語処理系側からの視点で必要な OS を簡単に作るというのもOSKitのターゲットとして考えられている.例えば,関数型言語からハードウェア資源を扱うにはどのような方式が適するのかなど.

  • JavaOS ([http://www.cs.utah.edu/flux/janos/ Janos])

  • [http://marte.unican.es/ MaRTE OS] . C + Ada で書かれたリアルタイムカーネル.

  • OSKit-Mach . Hurd がらみでこんなプロジェクトが存在するらしい.

    • GNU Mach 2.x 系のことかな.
    • [http://diary.enbug.org/?date=20030213#p02 外部パッケージへの依存] (enbug 2003-02-13): GNU Mach 1.x に関わっていた奥地さんは OSKit の使用に反対だったそうな.理由は研究プロジェクトである OSKit が継続的に開発されることに疑問だったから.研究としては daily work は評価されずうんぬんというくだりは納得できるけど,OSKit は成果がオープンになっているわけだし,Flex グループが解散してもボランティアベースで開発が続く可能性は高いような気がする.内情は知らないのでなんとも言えないし,OSKit をメンテナするのが結局 GNU Mach プロジェクトだけになってしまうなら二度手間だし,旨味はない気もするが.

ちょっと遊んでみようプロジェクト

  • YaWos

関連プロジェクト

  • [http://www.cs.utah.edu/flux/alchemy/ Alchemy] . システムソフトウェアをコンポーネント化するための言語,ツールに関するプロジェクト.
  • [http://www.pdos.lcs.mit.edu/click/ Click] (MIT) . Modular Router Project.Knitで実装されている?

2002-09-13 . bochs 上で OSKit を動かしてみる.

Hello,World カーネル程度の最低限のカーネルが必要とするライブラリは次の通り.

  • oskit_c . 最小限の ANSI/POSIX C ライブラリ. 例えば,シグナルスレッドはサポートしてない.これらを使うには代わりに oskit_freebsd_c を利用する.
  • oskit_lmm . リストベースメモリマネージャ.
  • oskit_clientos . クライアントOSライブラリ.アプリケーション(クライアントOS)を動作させるために必要となる各種初期化処理を提供する.例えば,C ライブラリの実行環境の構築とか.
  • oskit_kern . カーネルサポートライブラリ.マシン依存部 + 非依存部.スペシャルレジスタ,ページテーブル,プロセッサモードの操作,割込みハンドラの提供,GDB スタブなど.

OSKit は LinuxFreeBSDNetBSD のコードとそれらのグルーコードなどから成り立っている.確かに便利な気はするんだが,やっぱり力技って気がして,美しくないと思う(あくまでこれは第一印象でちゃんとコードを追えば違うのかもしれないが).

  • 例えば,Linux のドライバを提供する oskit_linux_dev.a,FreeBSD のドライバを提供する oskit_freebsd_dev.a などが提供されている.どのコンポーネントライブラリを組み合わせて利用するかを,リンクの段階ではなく,コーディングレベルで気にしなきゃならない気がする.

コンポーネントライブラリ

  • デバイスドライバ

    • oskit_freebsd_dev
      • システムコンソール,シリアルポート,PS/2 マウス
    • oskit_linux_dev
      • イーサネット,SCSI
  • プロトコルスタック

    • oskit_freebsd_net
  • ファイルシステム

    • oskit_linux_fs
      • ext2,msdoc,iso9660 など
      • ext2 のサンプル.[http://www-ftp.lip6.fr/pub/mach/mach4/oskit/mail/html/oskit-users/msg00791.html Linux ext2 filesystem] (oskit-users ML)
    • oskit_netbsd_fs
  • 仮想記憶

    • oskit_svm
      • 単一アドレス空間.メモリ保護とブロックデバイスへのページングを提供する.
    • oskit_netbsd_uvm
      • UVM
      • シンプルプロセスライブラリ(oskit_sproc)と組み合わせて,ユーザアドレス空間を作ってプロセスを動かすサンプルが付いている.
  • ユーザモードクライアントOS . Unix のユーザモードでクライアントOSを動かすためのライブラリ(oskit_unix)なんてのもある.

Clone this wiki locally