[B-Free memo 22]


POSIX サーバ概要
----------------

$Date: 2011/12/27 17:13:36 $
$Revision: 1.1 $



1. この文書の内容

  この文書は、B-Free プロジェクトのサブプロジェクトである POSIX 環境の
実現方式の概要について記述したものです。

  [内容]

   POSIX 環境についての説明
   実装方式
   POSIX システムコール一覧


  [単語一覧]

  POSIX
  POSIX アプリケーション
  POSIX プロセス
  lower library
  中心核		μITRON 3.0仕様に基づくマイクロカーネル


  !! 注意 !!
  本ドキュメントを作成した時点では、POSIX についての正式なドキュメント
  を入手することができませんでした。
  本ドキュメントは、以下の (POSIX 準拠ではないが UNIX 環境について説明
  している) 参考文献を主に参照して作成しています。

  o UNIX システムコール・プログラミング
  o UNIX 4.3 BSD の設計と構築


2. POSIX 環境とは何か

  POSIX 環境は、POSIX --- IEEE P1003 Portable Operating System
Interface for Computer Environment 標準に基づいたプログラムを実行する
ための環境です。
  (端的に言えば、UNIX 環境ということになります)

  POSIX 環境上で動作するアプリケーションは、BTRON 環境でのシステムコー
ルを使うことができません [*1] が、ファイル等システムグローバルな資源の
一部を共有することができます。BTRON ファイルシステムと比べると POSIX 
で規定されたファイルシステムは、レコードがないなどいくつか違いがありま
す。そのため、POSIX 環境でのファイルは、実際に二次記憶装置に入ったファ
イルの内容と違いがあります (レコードの情報などが欠落してみえる)。

  また、POSIX 仕様ではプロセス間の通信が貧弱 (パイプ等しかない) です。
プロセス間の通信を行うために(POSIX 仕様からは逸脱しますが)、BTRON 仕様
に基づくプロセス間通信の機能を追加します。

    [*1] POSIX 環境と BTRON 環境とでは、プロセスのもつ情報に違いがある
         ため。


3. 実現方式

3.1 POSIX サーバの構成

  POSIX 環境は、BTRON 環境と同じように、ITRON を呼び出し処理を行うサー
バと、POSIX システムコールを呼び出すアプリケーションから成り立っていま
す。

  POSIX サーバは単一のプロセスではなく、役割に応じて複数存在します。

  o プロセスサーバ
  o メモリ管理サーバ
  o POSIX ファイルサーバ

  なお、これらのサーバと同様の機能をもつサーバが B-Free OS の BTRON バー
ジョンにも存在します。しかし、名前が似ているだけで内容は全く別のもので
す。


3.2 ITRON とのインタフェース

3.2.1 POSIX API ライブラリ

  BTRON 環境と同様、POSIX 環境下のアプリケーションも中心核をそのまま
呼びだすことはできません。

  POSIX システムコールを実行するときには、実際の処理を行う POSIX サー
バと中心核レベルでの通信を行う必要があります。直接 ITRON システムコー
ルを発行できないアプリケーションのために、専用のライブラリが存在します。 
POSIX システムコールを呼び出すとき、アプリケーションはライブラリを呼び
出します(この呼びだしは、トラップにて行います)。

  このライブラリ自体は、CPU のカーネルモードで動作します。中心核は、カー
ネルモードで動いているライブラリからのシステムコール要求は受け付けるた
め、問題なく実行できます。


3.2.2 POSIX ライブラリの中身

  POSIX ライブラリは、中心核のシステムコールを使て POSIX サーバと通信
を行う lower library とアプリケーションにリンクされる通常の意味でのラ
イブラリの2種類あります。

  lower library は、システムのブート時にメモリ中へロードします。POSIX 
プロセスを生成するとき、そのプロセスの固有仮想空間 (Private virtual
memory space) へマッピングされます。マッピングするときコード部分につい
ては、POSIX プロセスすべてについて同じ物理メモリを使用します (物理メモ
リ節約のため)。しかし、データ部分についてはプロセスごとに別のメモリを
使わないとならないため、新しく物理メモリを割り当てます [*2]。


    [*2] さらに初期化が必要なデータ領域 (BSS) については、ライブラリを
         ロードしたときの該当領域をそのままコピーします。

  lower library でないライブラリは、POSIX API の中でもサーバと通信する
必要のない部分を担当します。
  --- たとえば、サーバに渡すときの引数の整理などを行う。


3.3 プロセスサーバ

3.3.1 プロセスサーバの役割

  プロセスサーバは、中心核のタスク管理機能を使って、POSIX 仕様でのプロ
セスを実現します。


3.3.2 プロセス生成

  POSIX 環境上でのプロセスが、新しいプロセスを生成するときには POSIX 
サーバに対してプロセスを生成するというメッセージを送信することによって
行います。

 プロセス生成は、次のステップによって行います。


  1) 親となるプロセスが POSIX API ライブラリの fork() 関数を呼びだす。

  2) POSIX API は Trap #65 を実行し、LOWLIB に制御を移す。

  3) LOWLIB は、POSIX プロセスサーバに fork することを知らせる。そうす
     ると、POSIX プロセスサーバから PROC ID が返ってくる。後の処理でプ
     ロセスを指定する場合には、この PROC ID を使用する。

  4) 新しいタスクを生成する (cre_tsk システムコール)。

  5) LOWLIB は、新しいプロセスのための仮想空間を確保する。
     仮想空間の確保は次のようにして行う。主に ITRON 拡張システムコール
     である、vXXX_reg 系のシステムコールを使用する。

     (1) vcre_reg システムコールを使って、リージョンを生成する。
         リージョンは、最低 テキスト/データ/スタックの3つある。
     (2) 親のタスクのリージョンの内容をコピーする。
         (vcop_reg システムコールを使用する)
     (3) プロセスマネージャに対して、新しく生成したプロセスの
         情報を登録する。
     (4) 子タスクの実行ポイントをライブラリ中の fork 関数の中の子プロ
         セス用エントリアドレスに指定する。
     (5) リターンする。

  6) 子タスクの実行 (sta_tsk システムコール)。


3.3.3 シグナル

  POSIX でのシグナルは、プロセス間で非同期のメッセージ伝達を行うもので
す。実際のメッセージ内容は、シグナル番号 (/usr/include/signal.h で規定)
として規定している番号だけとなっています。

  ITRON には、シグナルのような非同期に伝達を行うようなメッセージ機構は
ありません(ハードウェア割り込みは除く)。
  そこでシグナル機構を実現するために次の案があります。

  (1) ITRON 仕様を拡張する。
      メッセージ通信機能を拡張して非同期に受信できる機能を追加します。
      具体的には、メッセージハンドラを登録するシステムコール def_msg 
      のようなものを追加することになります。

  (2) シグナル受信専用タスクを使う。
      (POE [*1] などで使われている方法です)
      main() 関数を実行する通常処理とシグナルの処理とを2つのタスクで分
      割して処理します。
      シグナルを処理するタスクは、常時シグナル用メッセージバッファを受
      信するようにしておき、もしメッセージを受信した場合には main() 関
      数を実行しているタスクの実行を中断してシグナルハンドラを実行する
      ようにします(シグナルハンドラを定義していない場合には、シグナル
      のデフォルトの処理に従います。例えばシグナルが SIG_KILL の場合に
      はプロセスを消去します)。


3.4 メモリ管理サーバ

3.4.1 メモリ管理サーバと仮想記憶

  メモリ管理サーバは、POSIX プロセスに対して仮想メモリ空間を提供します。
  仮想メモリ機能は、システムコールによって明示的に実行する場合と必要に
  応じてメモリ管理サーバが実行する場合の2つの場合があります。

  明示的に実行する POSIX のシステムコールは brk と sbrk です。これらの
  システムコールは、POSIX プロセスのヒープ領域を拡張します。メモリ領域
  の管理ライブラリである malloc 関数の類は、brk および sbrk を使用して
  メモリ領域の拡張を行います。

  システムコールによらず暗示的にメモリ管理サーバが実行する場合とは、ペー
  ジフォールトが発生したときと、ページアウトする場合です。
  POSIX プロセスにてページフォールトが発生した時、各プロセスのページフォー
  ルトハンドラが実行されます(ページフォルトハンドラは、POSIX ライブラ
  リの中にあり、プロセスを実行する時の一番最初に登録を行うのでアプリケー
  ションは意識する必要がありません)。
  ページアウト処理は、メモリ管理サーバが実行している間恒常的に行います。


3.5 ファイルサーバ


3.5.1 複数のサブファイルシステム

  POSIX ファイルサーバは、複数のサブファイルシステムを扱います。

  1) DOS ファイルシステム
  2) BTRON ファイルシステム

  このうち BTRON ファイルシステムについては、3.5.1 で説明したように 
BTRON ファイルマネージャと通信することによって間接的にファイルをアクセ
スします。


3.5.2 POSIX ファイルシステムと BTRON ファイルシステム

  POSIX ファイルシステムと、BTRON ファイルシステムの間には、いくつかの
  相異点があります。
  POSIX 環境を構築するにあたっては、これらの相異点をどのように克服する
  かが一番の問題点となります。

  POSIX ファイルシステムと BTRON ファイルシステムとの相異点は以下のと
  おりです。

  (1) BTRON ファイルシステムでのファイルには、親ディレクトリという概念
      がない。
  (2) ファイル名の長さが BTRON1 仕様では 20 文字 (40 バイト) という制
      限がある。
  (3) BTRON の場合、任意のファイルから他のファイルを示すいくつかのリン
      クが張ることができるが、POSIX (UNIX) では、ファイルからはリンク
      を張ることができない(リンクを張ることができるのはディレクトリだ
      け)。
  (4) POSIX には、ファイルシステムの中に通常ファイル、ディレクトリ、ス
      ペシャルファイルという区別がある。BTRON の場合スペシャルファイル
      は、デバイスとファイルには別になっている (システムコール上も別に
      なっている)。また、BTRON では、通常ファイルとディレクトリの区別
      はない。

  POSIX ファイルサーバは、BTRON ファイルサーバと通信し、BTRON ファイル
  システムを POSIX ファイルシステムとあつかうための変換を行います。

3.5.3 ファイルサーバの動作

  POSIX ファイルサーバが行う処理は、次のようになります。

  main ()
  {
     ファイルサーバの初期化 ();

     /* メインループ */
     for (;;)
       {
         要求メッセージの受信 ();
         メッセージの処理 ();
         結果を送り返す ();
       }
  }

o ファイルサーバの初期化

  ファイルサーバは、内部のデータベースの中に以下の情報をもっています。

        ---- データベース一覧

  ファイルサーバの初期化では、これらの情報を管理するテーブルを初期化し
ます。また、サブファイルシステム(これらは別ディレクトリにソースがあり
ます)の初期化関数を呼び出します。
p

o 要求メッセージの受信

o 結果を送り返す

3.6 POSIX デバイス

  POSIX デバイスは、スペシャルファイルと呼ぶ通常のファイルと同様にアク
セスできる実体をもっています。ファイルシステムサーバは、アクセスするファ
イルがスペシャルファイルだった場合、デバイスドライバに対して要求を発行
します。

  POSIX デバイスとして、ファイルシステムに登録されているスペシャルファ
イルは以下のとおりです。

  スペシャルファイル
  ==================

  /dev/tty
  /dev/console
  /dev/hdXX
  /dev/rsXX
  /dev/keyboard
  

A. 参考文献

1. 「UNIX システムコール・プログラミング」
2. 「UNIX 4.3 BSD の設計と構築」
3. 「OS の設計上の新戦略に向けて」
    GNU ダイジェスト 1994 年 1 月
4.  Mach 3.0 のソース
5.  POE のソース


B. 改訂歴

$Log: posix.text,v $
Revision 1.1  2011/12/27 17:13:36  liu1
Initial Version.

Revision 1.3  1995-08-28 21:41:11  night
現状に合わせてサーバの種類などを変更した。

# Revision 1.2  1995/01/19  15:43:49  night
# プロセス生成についての記述を増やした。
#   プロセス生成の実行処理についての説明をつけた。
#
