
             ＝ TOPPERS/JSPカーネル ユーザズマニュアル ＝
                    (Linux シュミレーション環境)

             （Release 1.4対応，最終更新: 1-Dec-2003）

------------------------------------------------------------------------ 
 TOPPERS/JSP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Just Standard Profile Kernel

 Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                             Toyohashi Univ. of Technology, JAPAN

 上記著作権者は，以下の (1)〜(4) の条件か，Free Software Foundation 
 によって公表されている GNU General Public License の Version 2 に記
 述されている条件を満たす場合に限り，本ソフトウェア（本ソフトウェア
 を改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
 利用と呼ぶ）することを無償で許諾する．
 (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
     権表示，この利用条件および下記の無保証規定が，そのままの形でソー
     スコード中に含まれていること．
 (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
     用できる形で再配布する場合には，再配布に伴うドキュメント（利用
     者マニュアルなど）に，上記の著作権表示，この利用条件および下記
     の無保証規定を掲載すること．
 (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
     用できない形で再配布する場合には，次のいずれかの条件を満たすこ
     と．
   (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
       作権表示，この利用条件および下記の無保証規定を掲載すること．
   (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
       報告すること．
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．

 本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 よびTOPPERSプロジェクトは，本ソフトウェアに関して，その適用可能性も
 含めて，いかなる保証も行わない．また，本ソフトウェアの利用により直
 接的または間接的に生じたいかなる損害に関しても，その責任を負わない．

 @(#) $Id: linux.txt,v 1.1 2008/06/17 00:04:40 suikan Exp $
------------------------------------------------------------------------


1．Linux 上での動作環境の概要

TOPPERS/JSP のシミュレーション環境として、Linux 上で動作する設定を用意
している。このシミュレーション環境は、Linux の 1つのプロセスの中で複数
のタスクを切り替えて動作させる。


1.1. サポートしていない機能

Linux 上のシミュレーション環境では、TOPPERS/JSP が持っている機能の内、
以下の機能はサポートしていない。

・CPU例外ハンドラ
・def_int システムコール
・性能評価用システム時刻参照機能

CPU例外ハンドラについては，CPU例外ハンドラ自体の登録は可能であるが，
CPU例外ハンドラ内で，CPU例外が発生したコントキストや状態を参照できる
vxsns_XXX はCPU例外ハンドラにラッパーをかぶせることで実現できると思わ
れるが現在のところはサポートしていない．


1.2. 動作環境

TOPPERS/JSP Linux のシュミレーション環境は、シグナルスタックの機能を使
用するため、次のバージョン Linux カーネルとglibcが必要となる．

           ・カーネル :  2.2 以上
           ・glibc    :  2.1 以上          

次のディストリビューションでの動作を確認してる．
            
            ・Vine Linux 2.5,2.6
            ・Debian GNU/Linux 3.0



1.3. 割込み

Linux 上のシミュレーション環境では、シグナルが割込みに対応する．シグナ
ルハンドラは割込みハンドラとして扱われ、シグナルマスクが割込みマスクに
対応する。ユーザがシグナルハンドラを定義することも可能であるが、一定の
ルールに従うことが必要である。

Linux のシグナルの内、SIGUSR1 起動時処理、タスクディスパッチ処理のため
に用いているため、ユーザが利用することはできない。また、SIGALRM はカー
ネル内のタイマ割込みとして用いている．設定によっては，SIGIO のハンドラ
もカーネル内で定義される（SIGIO の扱いについては３章を参照）。



1.4. 時間管理

周期割込みの間隔は 10ミリ秒を標準としているが、ターゲット依存のタイマ
モジュールのみの修正で変更できる。シミュレーション環境全体が 1つのプロ
セスとして実行されるため，シミュレーション環境全体に割り当てられる CPU
時間が UNIX のスケジューラによって決められる。そのため、高い時間精度を
期待することはできない。




２．システムコール仕様の違い

以下では，BSD UNIX上でのシミュレーション環境での，各システムコールの仕
様の違いについて述べる．

(1) loc_cpu             割込みとディスパッチの禁止

・loc_cpu は，すべてのシグナルをマスクした状態に設定する．

(2) unl_cpu             割込みとディスパッチの許可

・unl_cpu は，すべてのシグナルマスクを解除した状態に設定する．

(3) chg_iXX             割込みマスク変更

・名称は chg_ims としている。chg_ims をサポートするかどうかを、
SUPPRT_CHG_IMS を定義するかどうかで変更できる。chg_ims は、シグナルマ
スクを指定した値に設定する。タスクコンテキストでは、ディスパッチャを呼
び出す SIGUSR1 シグナルのマスクを設定することはできない。(設定しようと
すると E_PAR エラーになる)。また、非タスクコンテキストでは SIGUSR1 を
解除することはできない。(解除しようとすると E_PAR エラーになる)。タス
クコンテキストでchg_ims により設定した値はディスパッチが発生しても他の
タスクに引き継がれる。非タスクコンテキストで設定した場合は、その非タス
クコンテキストの中でのみ有効である。

(4) get_iXX             割込みマスク参照

・名称は get_ims としている。ref_ims は、シグナルマスクの現在値を読み
出すシステムコールである。


(5) vget_tim            性能評価用システム時刻参照

・サポートしていない．



3．ノンブロッキングI/O

3.1. ノンブロッキングI/O の必要性

TOPPERS/JSP のシミュレーション環境全体が 1つのプロセスとして動作してい
るため、TOPPERS/JSP のタスクから UNIX カーネル内でブロックするシステム
コールを呼び出した場合、シミュレーション環境全体がブロックされ、他のタ
スクを実行することができなくなる（厳密には，ブロック中にシグナルを受け
取った場合には，ブロックが解除されて実行を継続できる）。そのため，UNIX 
カーネル内でのブロックが起こらないように、低速の I/Oアクセスは、ノンブ
ロッキングモードで行う必要がある。

Linux のノンブロッキングI/Oモードでは、通常であればカーネル中でブロッ
クされるような read/writeシステムコールからもすぐにリターンしてくる 
（この時，これらのシステムコールは EWOULDBLOCK エラーを報告する）．さ
らに非同期I/Oモードを併用すると、それらのシステムコールを呼び出しても
ブロックされない状況になった時に、UNIXカーネルは SIGIO シグナルを使っ
てそのことをプロセスに知らせる。


3.2. TOPPERS/JSP におけるサポート

Linux のノンブロッキングI/O を TOPPERS/JSP のタスクから利用するために
は、SIGIO を捕まえるシグナルハンドラを定義し、捕まえたシグナルを何らか
の形でタスクに通知する必要がある。そのための手段として、TOPPERS/JSP で
は、SIGIO シグナルの発生により呼び出されるコールバック関数を登録する機
能を用意している。

具体的には、SIGIO シグナルによりコールバック関数を実行させたい場合には、
SIGIO 通知イベントブロック（SIGIOEB）を用意し、その callback フィール
ドにコールバック関数へのポインタ、arg フィールドにコールバック関数へ渡
す引数を設定し、eneuque_sigioeb を用いて SIGIO 通知イベントキューに登
録する。SIGIO シグナルが発生すると、登録したコールバック関数がすべて呼
び出される。コールバック関数が 0 を返すと、関連する SIGIO 通知イベント
ブロックはキューに登録されたままとなり、続く SIGIO シグナルで再び同じ
コールバック関数が呼び出される。コールバック関数が 0 以外を返すと、
SIGIO 通知イベントブロックはキューから削除され、コールバック関数はそれ
以降呼び出されなくなる（include/linux_sigio.h,systask/linux_sigio.c）。
なお、SIGIO 通知イベントキューに登録する eneuque_sigioeb はセマフォを
使用するために、非タスクコンテキストから呼べないため、システム起動時の
初期化ルーチン等からは、enqueue_sigioeb_initialize を用いる。

ノンブロッキングI/O サポートモジュールは、コールバック関数を呼び出すた
めに、内部でタスクを 1つ（tskid = TSK_LINUX_SIGIO）と、SIGIO 通知イベ
ントキューに対する排他アクセスのためにセマフォを 1つ（semid =
SEM_LINUX_SIGIO）を用いている。ノンブロッキングI/O サポートモジュール
を用いるためには、システム構成設定ファイルで、内部で用いるタスクおよび
セマフォが使えるように設定しなければならない。


3.5. 疑似シリアルドライバ

Linux 上のシミュレーション環境を、ネイティブ環境となるべく近いものとす
るために、ネイティブ環境のシリアルインタフェースドライバと同等の機能を
持つ疑似シリアルドライバを用意している（systask/linux_serial.c）。疑似
シリアルドライバは、上で述べたノンブロッキングI/O の機能を用いて、シリ
アルポートに対する入出力を、標準入出力に対して行うものである。


４．インストール・その他

4.1. インストール

Linux 上のシミュレーション環境をインストールするには、TOPPERS/JSP の標
準リリースに含まれる以外に、以下のツールが必要である。

    GNU Cコンパイラ
    BINUTILS アセンブラ，リンカなど
    perl 5（動作確認は 5.005_03）
    GNU Make（動作確認は 3.78.1）


4.2. 疑似シリアルドライバ使用上の注意

疑似シリアルドライバは、標準入力をノンブロッキングの RAWモードに設定す
る。標準入力をノンブロッキングの RAWモードに設定したままの状態でプログ
ラムを終了すると、シェルが正しく動作しなくなる。そのため，TOPPERS/JSP 
を終了する前に必ず標準入力を元の状態に戻す必要があるが、プロセスを終了
させるシグナルは数多くあり、そのすべてには対処していない。また、ユーザ
プログラムで捕まえることのできないシグナルもあり、完全に対処することは
不可能である。


4.3. デバッガ使用上のヒント

Linux上のシミュレーション環境は、UNIX上のシンボリックデバッガと組み合
わせて使うことで、TOPPERS/JSP を用いたシステムのデバッグに力を発揮する
わけだが、デバッガと組み合わせて使う上で、TOPPERS/JSP がタスク切り替え
に SIGUSR1シグナルを使っているために、タスク切り替えの度にデバッガに制
御が戻ってしまうという問題がある。GNU シンボリックデバッガ（GDB）の場
合には、次のコマンドによりデバッガが SIGUSR1 を捕まえないように設定す
ることができる。

    (gdb) handle SIGUSR1 nostop noprint

このコマンドを、.gdbinit に設定しておくと便利である。

また、条件付ブレークポイントをサポートしているデバッガの場合は、特定の
タスクが特定のアドレスを実行した場合に限って実行を停止させることができ
る（停止するのは、システム全体で、特定のタスクだけではない）。例えば、
GDB の場合には、次のコマンドにより、ID が TSKID のタスクが関数 FUNC を
呼び出した場合にのみ実行を停止させることができる（厳密には、この指定方
法では、ID が TSKID のタスクが実行中に起動された割込みハンドラが FUNC 
を呼び出した場合にも停止する）。

    (gdb) break FUNC if _kernel_runtsk == &_kernel_tcb_table[TSKID-1]






