(toppers-users 1293) Re: フルセット版カーネルサービスコールの実装について

Takayuki WAKABAYASHI takayuki @ ertl.jp
2003年 12月 2日 (火) 14:12:44 JST


豊橋技術科学大学の若林です.

okazaki.futoshi @ renesas.com さんは書きました:
 > slp_tsk()のあるtask_sync.cを見てみましたら、slp_tsk()の直前に#ifdefがあり、
 > 生成されたtask_sync.objにも含まれていないことから、この#ifdefでコンパイルで除か
 > れてるようです。
(中略)
 > フルセット版に入っていたドキュメントやソースコードを一通り目を通しましたが、この
 > #ifdefを外す(必要なサービスコールを組み込む?)「正しい方法(手順)」のような記
 > 述が見つかりませんでした。

この話題をusersでして良いのかどうかの判断がつかないのですが...
 # フルセットの話題ならipa-oss,1.4の話題ならdev辺りが相当かと

既に一部公開されているTOPPERS/JSP (Windows) 1.4 prerelease β4に
付属のカーネルの場合で話をします.

JSP1.4β4の各APIは

 #ifdef __slp_tsk
 SYSCALL ER slp_tak() { ... }
 #endif

といったようにサービスコール毎にifdefされています.
多分岡崎さんが知りたいのは,このifdefを通過させる方法
と理解しています.

まず,JSP1.4から何がどう変わっているかについてから.

JSP1.4から,これまでslp_tskやwup_tskなどの全てのAPIを
一つのオブジェクトファイルにしていたものを,
slp_tsk.o, wup_tsk.o のようにAPI毎のオブジェクトファイルを
生成するようになっています.そして,カーネルに必要な全ての
ファイルをまとめたライブラリ,libkernel.aを作成します.

ifdefに使う定義は,実際にはMakefile中に記述されています.
正確には,jsp/obj/Makefileから,jsp/kernel/Makefile.kernelという
ファイルが参照されていて,その中に定義されています.
このMakefileは,libkernel.aを作成するための定義の一部を持っています.
定義はgccのコマンドラインオプション経由で直接指定されます.
slp_tsk.o というファイルを作成するときは,
    gcc -D__slp_tsk -O2 -wall -c -O slp_tsk.o task_sync.c
といったコマンドを実行します.

全てのAPIはlibkernel.aに含まれています.
APIはどこかで使用すればリンカによって引っ張られ,
勝手にリンクされます.使わなければ,リンクされません.
使用するに当たって,ユーザが特別の記述をする必要もありません.

次に,ifdefを通過させる方法です.

最初にMakefileが正しく1.4のものなのかを確認する必要がありそうです.
1.4対応のMakefileであれば,task_sync.oは生成されません.
libkernel.aが存在するか,または nm libkernel.a でslp_tskが存在するか
を確認してみてください.
存在しない場合,もう一度configureを実行し,生成されたMakefile中に
libkernel.a や Makefile.kernel といった文字列があるか確認してください.

また強制的に通過させるには,Windows(VC)依存部のapi.hのように,
全てのAPIを前のifdefを外すヘッダファイルを用意し,includeする手があります.
そのヘッダを,全てのファイルが参照するヘッダからincludeすれば
これまでと同じような結果を得ることが出来ます.
ただし,この場合Makefileは1.4対応のものを使用してはなりません.

以上,何かの参考になれば幸いです.
--------
豊橋技術科学大学 工学研究科 電子情報工学専攻
  若林 隆行 (mailto:takayuki @ ertl.jp)