ここでは、T-Kernel 2.0 の起動処理に関して説明します。
ハードウェアおよび実装に依存する処理に関しては、各機種ごとの「実装仕様書」を参照してください。。
システムがリセットすると、最初に T-Monitor が起動して以下の処理を実行します。
(1) リセット初期化処理
ハードウェアの初期化処理、および例外/割込みベクタなどの初期化処理を行います。具体的な処理は、ハードウェアおよび実装に依存します。
ROM 情報( rominfo ) の resetinit のアドレスが正当であれば、resetinit プログラムを実行します。
(2) T-Kernel プログラムのロード
起動可能なディスクが存在する場合
ディスク上のブートプログラムを RAM 上にロードして実行します。ブートプログラムは、必要な T-Kernel プログラムをディスク上から RAM 上にロードして T-Kernel の起動アドレスにジャンプし、T-Kernel を起動します。
起動可能なディスクが存在しない場合
ROM 情報 ( rominfo ) の kernel のアドレスが正当であれば、kernel のアドレスにジャンプして、T-Kernel を起動します。
kernel のアドレスが正当でなければ、T-Monitor のコマンド入力待ちに入ります。
(3) T-Kernel の起動
T-Monitor または ブートプログラムから T-Kernel の起動アドレスにジャンプしたときの CPU やハードウェアの状態は実装に依存しますが、原則として、CPU の動作モードは特権モード、割り込みは全て禁止された状態となります。
T-Kernel が起動した後は、以下の場合を除いて T-Monitor は使用されません。
システムの終了
tm_exit サービスコール
異常発生時のモニタ呼び出し
tm_monitor サービスコール
デバッグ用のコンソール出力
tm_putstring, tm_putchar サービスコール
例外や割込みの発生時
T-Kernel はシステムで定めたベクタテーブルにハンドラのベクタアドレスを設定するだけで、ハンドラの呼び出しは T-Monitor の例外/割込み処理ルーチンが行います。
T-Kernel が起動される際に、以下の情報がメモリ中に存在する必要があります。
(1) ROM 情報 ( rominfo )
ROM 上の固定アドレスに配置されるシステムの起動情報です。T-Monitor と T-Kernel の両方で参照します。
本情報は、ハードウェアおよび実装に依存します。
(2) システム共有情報 ( SysCommonInfo )
RAM 上の固定アドレスに配置されるシステムに関する共有情報です。システムの起動時に T-Monitor が設定し、T-Kernel の起動時にも一部のデータが設定されます。その後、T-Monitor と T-Kernel の両方により参照されます。
本情報は、ハードウェアおよび実装に依存します。
T-Kernel の起動アドレス "_start" に制御が移ると、以下の手順で T-Kernel/OS の初期化処理を実行します。
[ xxxxx
] は、関数が存在するソースプログラムの "kernel/" からの相対パス名を示します。
TーKernel Extension なしのとき、"<EXT_STUP>
" と "<EXT_MEM>
" はそれぞれ "noext", "nommu" になります。Extension を使用する場合は、Extension に対応した名称になります。
(1) _start - C 初期化ルーチン [ sysdepend/device/<機種名>/icrt0.S
]
レジスタ、キャッシュ、変数領域の初期化などのプログラム実行のための前処理を実行します。
ROM からの起動の場合は ROM 起動初期化ルーチン ROM_startup [ sysdepend/device/<機種名>/devinit.c
] を呼び出します。
本ルーチンは、ハードウェアおよび実装に依存します。
(2) main - カーネルのメインルーチン [ sysinit/src/sysinit_main.c
]
T-Kernel/OS の起動処理を開始します。本処理では、カーネル初期化処理 ( init_system
) を呼び出した後、カーネルメイン処理 ( t_kernel_main
) を呼び出します。
カーネルメイン処理からは復帰しません。
(3) init_system - カーネル初期化処理 [ sysinit/src/sysstartup.c
]
カーネルの初期化処理の各ルーチンを以下の手順で呼び出します。この段階では T-Kernel は起動していないので、T-Kernel のシステムコールを使用することはできません。
ここで行われる初期化処理は、カーネルメモリ管理の初期化など、T-Kernel/OS が起動するために必要な機能の初期化処理です。
(a) init_device - デバイスの初期化 [ sysdepend/device/<機種名>/devinit.c
]
(b) init_subsystems - サブシステムの初期化 [ extension/startup/<EXT_STUP>/subsystem.c
]
(c) init_segmgr - セグメント管理の初期化 [ extension/memory/<EXT_MEM>/segmgr.c
]
(d) init_memmgr - メモリ管理の初期化 [ extension/memory/<EXT_MEM>/memmgr.c
]
(e) init_Imalloc - カーネルメモリ管理の初期化 [ sysmgr/src/imalloc.c
]
(4) t_kernel_main - カーネルメイン処理 [ tkernel/src/tkstart.c
]
前述の main から init_system に続いて呼び出されます。T-Kernel/OS の各機能の初期化処理が行われ、最後に初期タスクを生成・起動します。初期タスクが生成される段階で、T-Kernel/OS の全ての機能は有効となっています。
初期タスクの起動をもって、T-Kernel/OS の起動処理は終了します。
(a) cpu_initialize - CPU 関連初期化処理 [ sysdepend/cpu/<機種名>/cpu_init.c
]
カーネル内で使用する例外ハンドラの登録、コプロセッサ関連の設定などの CPU に依存する初期化処理を実行します。
(b) tkdev_initialize - デバイス関連初期化処理 [ sysdepend/device/<機種名>/tkdev_init.c
]
各デバイスの割込み禁止など、CPU 以外のハードウェアに依存する初期化処理を実行します。
(c) 各機能モジュールの初期化
機能モジュールの初期化ルーチンを以下の順に実行します。
tkernel/src/task.c
]tkernel/src/semaphore.c
]tkernel/src/eventflag.c
]tkernel/src/mailbox.c
]tkernel/src/messagebuf.c
]tkernel/src/rendezvous.c
]tkernel/src/utex.c
]tkernel/src/mempool.c
]tkernel/src/mempfix.c
]tkernel/src/time_calls.c
]tkernel/src/time_calls.c
]tkernel/src/subsystem.c
]tkernel/src/subsystem.c
]tkernel/src/timer.c
](d) init_task_startup - 初期タスクの生成/起動 [ tkernel/src/tkstart.c
]
初期タスクを生成し起動します。
初期タスク init_task [ sysinit/sysinit_main.c
] は、T-Kernel/SM 等の上位のシステムや T-Kernel Extension の起動処理を以下の手順で実行した後、ユーザが定義した処理に実行を移します。
(1) start_system - 上位システムの起動 [ sysinit/src/sysstartup.c
]
T-Kernel/SM 等の上位のシステム、およびデバイスドライバの起動処理を以下の手順で実行します。本処理をもって T-Kernel の初期化/起動処理は終了します。
(a) start_segmgr - セグメント管理の起動 [ extension/memory/<EXT_MEM>/segmgr.c
]
(b) start_memmgr - メモリ管理の起動 [ extension/memory/<EXT_MEM>/memmgr.c
]
(c) SystemManager - T-Kernel/SM の起動 [ sysmgr/src/smmain.c
]
T-Kernel/SM を起動します。以降、T-Kernel/SM の機能が利用できます。
(d) _InitLibtk - ライブラリ( libtk )の初期化 [ ../lib/libtk/src/libinit.c
]
libtk ライブラリを初期化します。以降、libtk ライブラリ関数を利用できます。
(e) start_device - デバイスドライバの起動 [ sysdepend/device/<機種名>/devinit.c
]
デバイスドライバの登録/起動を行います。
(f) start_subsystem - サブシステムの起動 [ extension/startup/<EXT_STUP>/subsystem.c
]
サブシステムの登録/起動を行います。T-Kernel Extension を使用する場合には、Extension で使用するサブシステムやデバイスドライバの登録/起動を行います。
(2) init_task_main - 初期タスクメイン処理 [ sysmain/src/init_task_main.c
]
以下の手順で、ユーザ定義のアプリケーションの処理を実行します。
(a) userinit - ユーザ定義の初期化処理
ROM 情報(rominfo) の userinit のアドレスが正当であれば、userinit プログラムを実行します。
(b) usermain - ユーザ定義の初期タスクメイン処理 [ sysmain/src/usermain.c
]
ユーザが定義した初期タスクのメイン処理です。この処理を終了すると初期タスクは終了し、T-Kernel の終了処理を実行して、システムをシャットダウンします。