ここでは、T-Kernel 2.0 のソースコードの構成に関して説明します。
T-Kernel 2.0 の機能仕様に関しては、トロンフォーラム から公開されている「T-Kernel 2.0 仕様書」を、実装に依存する部分に関しては、「T-Kernel 2.0(tef_em1d)実装仕様書」 を参照してください。
T-Kernel のディレクトリ構成に関する基本ルールおよび用語を以下に示します。
機種名
T-Kernel では、動作対象となるハードウェアを以下の形式の <機種名> で表現します。
<機種名> : <ボード名>_<CPU名>
<ボード名> : ボードの種別を示す略称
<CPU名> : CPU の種別を示す略称
本パッケージで対象としている <機種名> は以下となります。
ted_em1d :
<ボード名> : tef - T-Engineリファレンスボード
<CPU名> : em1d - EMMA Mobile 1-D (ARM11コア)
この <機種名> および <CPU名> をサブディレクトリ名として使用することにより、1 つのディレクトリツリー上で複数の動作対象ハードウェアに対応することが可能となります。
ソースディレクトリ
ソースファイルを置くためのディレクトリで、原則として "src" の名称のディレクトリです。
構築ディレクトリ
機種ごとのオブジェクトファイルを構築するためのディレクトリで、原則として "build/<機種名>" の名称のディレクトリです。
オブジェクトファイルを構築するには、構築ディレクトリ上で "make" を実行します。
make のターゲットには以下のものがありますが、通常は、"make" のみで構築できるようになっています。
make make all と同じ
make all 通常 make
make install 結果を所定ディレクトリにコピー
make clean 結果を削除して初期化
make source SVC/拡張SVC I/F ソースの自動生成
make clean_source make source で生成したソースの削除
make clean_all make clean + make clean_source
構築ディレクトリには、make を実行するための Makefile および 構築結果のオブジェクトファイルが置かれます。
通常、Makefile では機種に依存しない共通部分を Makefile.common として分離して、include するようにします。Makefile.common はソースディレクトリ("src/Makefile.common")、または構築ディレクトリ直下 ("build/Makefile.common") に置きます。
ハードウェア依存部
動作対象のハードウェアに依存して変更が必要な部分で、"sysdepend/<機種名>" または "sysdepend/<CPU名>" の名称のディレクトリです。後者は CPU のみに依存する場合に使用します。
ハードウェアに依存する部分を別ディレクトリとして明確に分離することにより、新しいハードウェアへの移植の際に確認/変更が必要なソースコードが限定され、移植が容易になります。
アプリケーション依存部
実際にアプリケーションを開発し、製品等に組み込む場合に変更が必要な部分です。
アプリケーション依存部は、製品ごとに作成する必要がありますので、本パッケージではサンプルを提供しています。
カーネル基本部
ハードウェアやアプリケーションなどに依存しない、T-Kernel として基本的な機能を提供する部分です。
T-Kernel の機能を改変するのではない限り、カーネル基本部を変更する必要はありません。
T-Kernel ソース全体のディレクトリ構成図を以下に示します。
本パッケージでは、<機種名> は "tef_em1d"、<CPU名> は "em1d" となります。
[ハードウェア依存部] または [アプリケーション依存部] の記述がない部分は、カーネル基本部です。
一部のディレクトリの中には、"_dmy" という名称のファイルが入っています。このファイルは、アーカイバなどの利用を考慮し、ディレクトリが空になることを避けるためのダミーファイルで展開後は不要です。
tkernel_source
|
|-- kernel T-Kernel 本体
| |-- sysinit システム初期化
| | |-- src
| | `-- build
| | `-- <機種名>
| |-- tkernel T-Kernel/OS
| | |-- src
| | `-- build
| | `-- <機種名>
| |-- sysmgr T-Kernel/SM
| | |-- src
| | `-- build
| | `-- <機種名>
| |-- sysmain システムメイン
| | |-- src [アプリケーション依存部]
| | `-- build
| | `-- <機種名>
| |-- sysdepend [ハードウェア依存部]
| | |-- cpu CPU依存部
| | | `-- <CPU名>
| | `-- device デバイス依存部
| | `-- <機種名>
| `-- extension Extension 関連部
| |-- memory メモリ管理
| | `--nommu MMUなし
| `-- startup Extension 起動/終了処理
| `--noext Extension なし
|
|
|-- lib ライブラリ
| |-- build オブジェクト(構築)ディレクトリ
| | `-- <機種名>
| |-- crt スタートアップルーチン
| | |-- crt0 共通スタートアップルーチン
| | | |-- src
| | | | `-- sysdepend [ハードウェア依存部]
| | | | `-- <機種名>
| | | `-- build
| | | `-- <機種名>
| | `-- crttk T-Kernel プログラムスタートアップ
| | |-- src
| | | `-- sysdepend [ハードウェア依存部]
| | | `-- <機種名>
| | `-- build
| | `-- <機種名>
| |-- libsvc T-Kernel システムコール I/F ライブラリ
| | |-- src
| | | `-- sysdepend [ハードウェア依存部]
| | | `-- <CPU名>
| | `-- build
| | `-- <機種名>
| |-- libtk T-Kernel 関数コールライブラリ
| | |-- src
| | | `-- sysdepend [ハードウェア依存部]
| | | `-- <機種名>
| | `-- build
| | `-- <機種名>
| |-- libtm T-Monitor サービスコール I/F ライブラリ
| | |-- src
| | | `-- sysdepend [ハードウェア依存部]
| | | `-- <機種名>
| | `-- build
| | `-- <機種名>
| |-- libstr 文字列操作ライブラリ
| | |-- src
| | `-- build
| | `-- <機種名>
| |-- libsys システム操作ライブラリ
| | |-- src
| | `-- build
| | `-- <機種名>
| `-- libdrvif デバイスドライバ操作ライブラリ
| |-- src
| `-- build
| `-- <機種名>
|
|
|-- include 各種定義ファイル(ヘッダファイル)
| |-- tk T-Kernel 関連の定義ファイル
| | `-- sysdepend [ハードウェア依存部]
| | `-- <機種名>
| |-- sys システム内部情報の定義ファイル
| | |-- sysdepend [ハードウェア依存部]
| | | `-- <機種名>
| | `-- svc システムコール/拡張 SVC 定義
| |-- tm T-Monitor 関連の定義ファイル
| `-- device デバイスドライバ関連の定義ファイル
|
|
|-- config システム構成情報ファイル
| |-- src
| | `-- sysdepend [ハードウェア依存部]
| | `-- <機種名>
| `-- build
| `-- <機種名>
|
|
|-- etc make ルール、各種スクリプト
| `-- sysdepend [ハードウェア依存部]
| |-- cpu
| | `-- <CPU名>
| `-- <機種名>
|
|
`-- bin 実行イメージファイル
`-- <機種名>
sysinit ディレクトリ [カーネル基本部]
T-Kernel の初期化/終了処理ルーチンのソースコードを含みます。
構築ディレクトリでは、sysinit モジュールオブジェクトを構築します。
tkernel ディレクトリ [カーネル基本部]
T-Kernel/OS のソースコードを含みます。
構築ディレクトリでは、tkernel モジュールオブジェクトを構築します。
sysmgr ディレクトリ [カーネル基本部]
T-Kernel/SM (ライブラリで実装される部分を除く) のソースコードを 含みます。
構築ディレクトリでは、sysmgr モジュールオブジェクトを構築します。
sysmain ディレクトリ [アプリケーション依存部]
T-Kernel の初期タスクとして実行するプログラムおよびタスク生成パラメータなどのソースコードを含みます。
初期タスクとして実行する処理はアプリケーションに依存するため、この部分はアプリケーションごとに作成する必要があります。サンプルとして、簡単なタスク操作を行った結果を T-Monitor のサービス関数を用いてコンソールに出力するプログラムが入っていますので、これを参考にして作成してください。
構築ディレクトリでは、ライブラリやカーネル基本部、デバイスドライバなどの必要なすべてのモジュールの構築を一括して行い、それらをリンクして、T-Kernel システム全体の最終的な実行イメージファイルを構築します。
sysdepend ディレクトリ [ハードウェア依存部]
動作対象のハードウェアに依存し、移植の際には変更が必要になるソースコードを含みます。構築ディレクトリはありません。
sysdepend/cpu/<CPU名> ディレクトリ
動作対象のハードウェアの CPU にのみ依存するソースコードを含みます。異なるハードウェアでも 同一 CPU であれば、変更する必要はありません。
sysdepend/device/<機種名> ディレクトリ
動作対象のハードウェアのボード(CPU 以外の部分)に依存するソースコードを含みます。同一 CPU でも異なるハードウェア(バスや割り込みなどの接続が異なる)の場合は、変更する必要があります。
extension ディレクトリ
T-Kernel の Extension を実装する際に変更が必要になるソースコードを含みます。構築ディレクトリはありません。Extension なしの標準システムでは変更する必要はありません。
extension/memory ディレクトリ
T-Kernel のメモリ管理に関するソースコードを含みます。
標準システムでは サブディレクトリ "nommu" にある、MMU を使用せず実メモリのみに対応したソースコードを使用します。
Extension として、メモリ保護など、メモリ管理モデルを変更する場合は、Extension に対応したサブディレクトリを作成して、該当するソースコードを置いて使用します。
extension/startup ディレクトリ
Extension を構成するプログラム(サブシステムやデバイスドライバ)の起動/終了処理を行うソースコードを含みます。
標準システムでは サブディレクトリ "noext" にある、Extension なしに対応したソースコードを使用します。
Extension を実装する場合は、Extension に対応したサブディレクトリを作成して、該当するソースコードを置いて使用します。
build/<機種名> ディレクトリ
全ライブラリのオブジェクトファイルを保持している構築ディレクトリで、ライブラリをリンクする際に指定するディレクトリパスです。
各ライブラリごとの構築ディレクトリで構築したライブラリのオブジェクトファイルは、本構築ディレクトリにコピーされます。その際、古いオブジェクトファイルは、"!OLD" の名称のサブディレクトリにバックアップされます。
また、本構築ディレクトリで make を行うと、全ライブラリのオブジェクトファイルを一括構築します。
crt ディレクトリ
アプリケーションプログラムを独立してリンクする場合に使用するスタートアップルーチンです。
標準システムでは、T-Kernel 本体とアプリケーションプログラムは一緒にリンクされ、専用のスタートアップルーチン ( kernel/sysdepend/device/<機種名>/icrt0.S ) を使用するため、このスタートアップルーチンは使用しません。
crt/crt0 ディレクトリ
C 言語の共通のスタートアップルーチンです。ソースコードはアセンブリで記述され、ハードウエア依存部として "src/sysdepend/<機種名>" のサブディレクトリに置かれます。
構築ディレクトリでは、"crt0.o", "crtn.o", "crti.o", "crt1f.o", "crt1s.o", "crtir.o" のオブジェクトファイルを構築します。リンカは、これらのオブジェクトファイルから必要なものを選択的にリンクします。
crt/crttk ディレクトリ
デバイスドライバやサブシステムなどのシステムプログラムのスタートアップルーチンです。"src" サブディレクトリ直下はカーネル基本部で、"src/sysdepend/<機種名>" のサブディレクトリがハードウエア依存部です。
構築ディレクトリでは、"crttk.o" オブジェクトファイルを構築します。
libsvc ディレクトリ
T-Kernel のシステムコール/拡張SVC のインタフェースライブラリです。インタフェースライブラリはアセンブリで記述され、ハードウエア依存部(CPU 依存)となります。
インタフェースライブラリのソースコードは、システムコールの定義ヘッダファイルから自動生成して "src/sysdepend/<CPU名>" のサブディレクトリに置かれます。
構築ディレクトリでは、libsvc.a ライブラリを構築します。
libtkディレクトリ
T-Kernel/SM 機能のライブラリ実装部分です。
"src" サブディレクトリ直下はカーネル基本部で、"src/sysdepend/<機種名>" のサブディレクトリがハードウエア依存部です。
構築ディレクトリでは、libtk.a ライブラリを構築します。
libtmディレクトリ
T-Monitor のサービスコールのインタフェースライブラリです。"src" サブディレクトリ直下はカーネル基本部で、"src/sysdepend/<機種名>" のサブディレクトリがハードウエア依存部です。
構築ディレクトリでは、libtm.a ライブラリを構築します。
libstrディレクトリ
T-Kernel およびライブラリ内で使用しているメモリ/文字列操作の標準的なライブラリ関数のソースコードです。ハードウェア依存部はありません。
構築ディレクトリでは、libstr.a ライブラリを構築します。
libsys ディレクトリ
T-Kernel およびライブラリ内で使用しているビット操作、キュー操作などの基本的なライブラリ関数のソースコードです。ハードウェア依存部はありません。
構築ディレクトリでは、libsys.a ライブラリを構築します。
libdrvif ディレクトリ
T-Kernel のデバイスドライバを作成するためのインタフェースライブラリのソースコードです。ハードウェア依存部はありません。
デバイスドライバは、T-Kernel のシステムコールを直接使用して作成できますが、本ライブラリを使用することで、より容易に作成可能となります。
構築ディレクトリでは、libdrvif.a ライブラリを構築します。
本ディレクトリは定義ファイルのみですので、オブジェクトは生成されません。
include ディレクトリ直下
include ディレクトリ直下には、共通で使用される型定義ファイルが置かれます。include 直下のファイルは、すべてカーネル基本部です。
tk ディレクトリ
T-Kernel 関連の定義ファイルです。
"tk" ディレクトリ直下はカーネル基本部で、"tk/sysdepend" のサブディレクトリがハードウエア依存部です。原則として、ハードウエア依存部の定義ファイルはカーネル基本部の定義ファイルから include されますので、ハードウェア依存部の定義ファイルを直接参照する必要はありません。
sys ディレクトリ
T-Kernel システム内部の情報に関する定義ファイルです。サブシステムやライブラリなどシステムプログラムの中で使用され、通常アプリケーションプログラムが使用することはありません。
"sys" ディレクトリ直下はカーネル基本部で、"sys/sysdepend" のサブディレクトリがハードウエア依存部です。原則として、ハードウエア依存部の定義ファイルはカーネル基本部の定義ファイルから include されますので、ハードウェア依存部の定義ファイルを直接参照する必要はありません。
"sys/svc" サブディレクトリには、T-Kernel のシステムコール/拡張SVCの定義ファイルが置かれます。サブシステムなどシステムプログラムの中で使用され、通常アプリケーションプログラムが使用することはありません。これらの定義ファイルは、T-Kernel のシステムコール/拡張SVC のインタフェースライブラリ(libsvc)のソースコードの自動生成時に、同時に自動的に生成されます。
device ディレクトリ
デバイスドライバ関連の定義ファイルです。すべてハードウェア依存部です。
tm ディレクトリ
T-Monitor およびデバッグ関連の定義ファイルです。ハードウェア依存部はありません。
T-Kernel で使用されるシステム構成情報ファイル (rominfo、SYSCONF、DEVCONF) が置かれます。
ソースコードは、"src/sysdepend/<機種名>" のサブディレクトリに置かれ、すべてハードウェア依存部です。システム構成情報のソースファイル名は、"xxxx.c" ではなく、"SYSCONF" および "DEVCONF" ですので注意してください。
構築用ディレクトリでは、システム構成のロードイメージファイル (rominfo.mot) を構築します。構築の際には、"perl" を使用して、"SYSCONF" および "DEVCONF" をそれぞれ "sysonf.c", "devconf.c" に 自動変換してコンパイルします。
T-Kernel の構築で使用される共通のコマンドやスクリプトファイルが置かれます。
すべての Makefile で include する 基本部分である makerules が置かれます。
T-Kernel のシステムコール/拡張 SVC インタフェースライブラリ、および定義ファイルを自動生成するための "perl" スクリプトファイルが置かれます。
"sysdepend/<機種名>" および "sysdepend/cpu/<CPU名>" のサブディレクトリがハードウェア依存部です。
以下の構築ディレクトリで構築した最終的な実行/ロードイメージファイルとリンクマップが、"<機種名>" のサブディレクトリに置かれます。その際、古いオブジェクトファイルは、"!OLD" の名称のサブディレクトリにバックアップされます。
kernel/sysmain/build/<機種名> T-Kernel 本体
config/build/<機種名> システム構成情報
monitor/tmmain/build/<機種名> T-Monitor 本体
カーネルオブジェクト
T-Kernel では以下のカーネルオブジェクトを使用します。
種別 | ID (注1) | 名 称 | 説 明 |
---|---|---|---|
タスク | 1 | INIT | 初期タスク |
2 | SYSLOG | syslog タスク (注2) | |
メッセージ | 1 | SYSLOG | syslog 受信用 (サイズ 6KB) (注2) |
バッファ | 2 | DEvt | 事象通知(サイズ1KB), SYSCONFのTDEvtMbfSzで変更可 |
セマフォ | 1 | MemMgr | メモリマネージャのロック制御 |
2 | DevSync | デバイス管理同期制御 | |
イベント | 1 | DevMgr | デバイス管理全体のロック制御 |
フラグ | 2 | LibTk | libtk 全体のロック制御 |
サブシステム
T-Kernel ではシステム内で以下のサブシステムを使用します。
サブシステム ID | 説 明 |
---|---|
8 | T-Kernel/SM デバイス管理 |
9 | T-Kernel/SM システム管理 |
17 | セグメントマネージャ |