													TOPPERS Confidential
		TOPPERSプロジェクト 設計メモ
		TOPPERS/HRP2 動的生成機能拡張パッケージに関するメモ

		作成者: 高田広章（名古屋大学）
		最終更新: 2014年4月20日

○メモの位置づけ

このメモは，TOPPERS/HRP2カーネルに追加する動的生成機能拡張パッケージの
仕様を検討するものである。

○基本方針

・オブジェクトの動的生成機能をサポートする。

・メモリの動的な管理は行わない。

・TOPPERS新世代カーネル統合仕様に準拠する。
	- 必要であれば統合仕様を修正する。

・カーネルの機能は最小限とする。
	- ミドルウェアや動的ローダで実現できることは，そちらに任せる。

・ターゲット依存部の修正必要箇所は最小限とする。
	- ユーザスタック領域の扱いのみターゲット依存部で対応する必要がある。

・整数型は32ビット以上であることを想定する。
	- オブジェクト属性中に保護ドメインIDを入れるための制約。

○メモリ管理の方針

オブジェクトを動的に生成するサービスコールにおけるメモリの扱いは次の通
りとする。

基本原則として，オブジェクトの生成時に必要なメモリ領域は，オブジェクト
を生成するサービスコールを呼び出すモジュールが用意し，サービスコールに
対して渡すこととする。言い換えると，メモリ領域の先頭番地としてNULLを渡
し，カーネルに割り付けさせる方法は用いない。

ただし，カーネルの用いるオブジェクト管理領域およびそれと同様に扱われる
領域については，メモリ領域の先頭番地としてNULLを渡すと，カーネルが割り
付ける機能を用意する。

●カーネルの用いるオブジェクト管理領域およびそれと同様に扱われる領域

HRP2カーネルでは，以下のメモリ領域が，カーネルの用いるオブジェクト管理
領域およびそれと同様に扱われる領域に該当する。

　・システムタスクのスタック領域
　・ユーザタスクのシステムスタック領域
　・非タスクコンテキスト用のスタック領域
　・データキュー管理領域
　・優先度データキュー管理領域
　・固定長メモリプール管理領域

ただし，非タスクコンテキスト用のスタック領域については，動的に確保する
ためのサービスコールを用意しないため，ここでの議論の対象外とする。

これらのメモリ領域の先頭番地としてNULL以外を渡した場合，指定されたメモ
リ領域が，カーネル専用のメモリオブジェクト（書込みアクセスおよび読出し
アクセスが可能で，4つの種別のアクセスがカーネルドメインのみに許可された
メモリオブジェクト）に含まれているかチェックし，含まれていない場合は，
E_OBJエラーとする。

これらのメモリ領域の先頭番地としてNULLを渡すと，DEF_KMMにより設定したメ
モリ領域の中から，カーネルが割り付ける。DEF_KMMにより設定するメモリ領域
は，カーネル専用のメモリオブジェクトに含まれていなければならない。

●その他のメモリ領域

HRP2カーネルでは，以下のメモリ領域が，その他のメモリ領域に該当する。

　・ユーザタスクのユーザスタック領域
　・固定長メモリプール領域

これらのメモリ領域の先頭番地としてNULL以外を渡した場合，指定したメモリ
領域が妥当なものであるかチェックし，妥当でない場合には，E_PARエラーまた
はE_OBJエラーとする。

ユーザタスクのユーザスタック領域として妥当なメモリ領域かどうかのチェッ
クは，ターゲット依存とする（CHECK_TARGET_USTACKマクロ）。ARMv7依存部で
は，スタックポインタに必要な境界にアラインされており，ユーザタスクが属
する保護ドメインから書込みアクセスおよび読出しアクセスが可能なメモリオ
ブジェクトに含まれている場合に，妥当なメモリ領域であるとしている。MPUを
持つプロセッサでは，このチェック方法は全く異なるものになるだろう。

固定長メモリプール領域は，1つのメモリオブジェクトに含まれており，ターゲッ
ト定義の境界にアラインされている場合に，妥当なメモリ領域であるとする。
そのメモリオブジェクトの属性やアクセス許可ベクタはチェックしない。

これらのメモリ領域の先頭番地としてNULLを渡すと，E_NOSPTエラーを返すもの
とする。

○生成するオブジェクトの属する保護ドメインの指定

acre_yyyにおいて，生成するオブジェクトが属する保護ドメインは，オブジェ
クト属性にTA_DOM(domid)を指定することで指定する。ドメインIDは，オブジェ
クト属性中で，16ビット左シフトされた8ビット符号付き整数で表現される。オ
ブジェクト属性（整数型）が16ビットである場合はサポートしない。

○ユーザドメインが使えるタスク優先度

現行の仕様では，ユーザドメインに属するタスクが，タスクの優先度を不当に
高く設定することで，システム全体の動作（特に，システムサービスの動作）
を妨害するのを防ぐ手段がない。そこで，ユーザドメインが使えるタスク優先
度の制限する機能を設ける。

具体的には，ユーザドメインに対して，最高タスク優先度（優先度の値として
は最小）を設定する静的API（LMT_DOM）を設ける。そのユーザドメインに属す
るタスクが，chg_priにより，対象タスクの優先度をそれよりも高い優先度に設
定しようとした場合，E_ILUSEエラーとなるものとする。この制限は，あくまで
も，chg_priを呼び出したタスクが属する保護ドメインに基づいて行われる。タ
スク優先度を制限されたユーザドメインに属するタスクの優先度を，他の保護
ドメインから，制限したよりも高い優先度に設定することは可能である。

同様の制限を，タスク生成時の初期優先度やミューテックス生成時の優先度上
限に適用することも考えられるが，オブジェクトの生成はカーネルドメイン
（または，特別な権限を与えられたユーザドメイン）が行うため，これらには
適用しないこととする。

これにより，統合仕様書には，LMT_DOMの規定を追加することに加えて，以下の
変更を行う。

まず，「2.3.3 保護機能」の節に，以下の記述を追加する。

--------------------
(9) ユーザドメインから行える処理に対する制限

ユーザドメインに属する処理単位が，システムの重要な処理に悪影響を及ぼす
のを防ぐために，ユーザドメインから行える処理に対して制限を設ける機能が
用意されている．具体的には，ユーザドメインに属する処理単位が，タスクの
ベース優先度を変更する際に，指定できるタスク優先度を制限することができ
る．

この機能を実現するために，各ユーザドメインは次の情報を持つ【NGKI0531】．

　・指定できる最高のタスク優先度

なお，カーネルドメインに対しては，制限を設ける機能を用意していない．す
なわち，カーネルドメインに属する処理単位は，すべてのタスク優先度を使う
ことができる【NGKI0532】．
--------------------

chg_priの仕様には，以下の記述を追加する。

--------------------
保護機能対応カーネルで，chg_priを呼び出した処理単位がユーザドメインに属
する場合，tskpriは，そのユーザドメインが指定できる最高のタスク優先度と
同じかそれより低くなければならない．そうでない場合には，E_ILUSEエラーと
なる【NGKI3440】．
--------------------

○追加実装するAPI

追加実装するAPIは，以下の通り。

サービスコール

	ER_ID tskid = acre_tsk(const T_CTSK *pk_ctsk)
	ER ercd = sac_tsk(ID tskid, const ACVCT *p_acvct)
	ER ercd = del_tsk(ID tskid)
	ER ercd = def_tex(ID tskid, const T_DTEX *pk_dtex)
	ER_ID semid = acre_sem(const T_CSEM *pk_csem)
	ER ercd = sac_sem(ID semid, const ACVCT *p_acvct)
	ER ercd = del_sem(ID semid)
	ER_ID flgid = acre_flg(const T_CFLG *pk_cflg)
	ER ercd = sac_flg(ID flgid, const ACVCT *p_acvct)
	ER ercd = del_flg(ID flgid)
	ER_ID dtqid = acre_dtq(const T_CDTQ *pk_cdtq)
	ER ercd = sac_dtq(ID dtqid, const ACVCT *p_acvct)
	ER ercd = del_dtq(ID dtqid)
	ER_ID pdqid = acre_pdq(const T_CPDQ *pk_cpdq)
	ER ercd = sac_pdq(ID pdqid, const ACVCT *p_acvct)
	ER ercd = del_pdq(ID pdqid)
	ER_ID mtxid = acre_mtx(const T_CMTX *pk_cmtx)
	ER ercd = sac_mtx(ID mtxid, const ACVCT *p_acvct)
	ER ercd = del_mtx(ID mtxid)
	ER_ID mpfid = acre_mpf(const T_CMPF *pk_cmpf)
	ER ercd = sac_mpf(ID mpfid, const ACVCT *p_acvct)
	ER ercd = del_mpf(ID mpfid)
	ER_ID cycid = acre_cyc(const T_CCYC *pk_ccyc)
	ER ercd = sac_cyc(ID cycid, const ACVCT *p_acvct)
	ER ercd = del_cyc(ID cycid)
	ER_ID almid = acre_alm(const T_CALM *pk_calm)
	ER ercd = sac_alm(ID almid, const ACVCT *p_acvct)
	ER ercd = del_alm(ID almid)
	ER_ID isrid = acre_isr(const T_CISR *pk_cisr)
	ER ercd = sac_isr(ID isrid, const ACVCT *p_acvct)
	ER ercd = del_isr(ID isrid)

静的API

	AID_TSK(uint_t notsk)
	AID_SEM(uint_t nosem)
	AID_FLG(uint_t noflg)
	AID_DTQ(uint_t nodtq)
	AID_PDQ(uint_t nopdq)
	AID_MTX(uint_t nomtx)
	AID_MPF(uint_t nompf)
	AID_CYC(uint_t nocyc)
	AID_ALM(uint_t noalm)
	AID_ISR(uint_t noisr)
	DEF_KMM({ SIZE kmmsz, STK_T *kmm })
	LMT_DOM({ PRI mintpri })

新世代カーネル統合仕様書に規定のない機能の仕様は以下の通り。LMT_DOMは，
今後，新世代カーネル統合仕様書に追加する。

----------------------------------------------------------------------
LMT_DOM		保護ドメインに対する制限の設定〔SP〕【NGKI3441】

【静的API】
	LMT_DOM({ PRI mintpri })

【パラメータ】
　＊保護ドメインに対する制限の設定情報
	PRI			mintpri		指定できる最高のタスク優先度

【エラーコード】
	E_RSATR		予約属性
				・ユーザドメインの囲みの中に記述されていない【NGKI3442】
				・クラスの囲みの中に記述されている〔M〕【NGKI3443】
	E_OBJ		オブジェクト状態エラー
				・保護ドメインに対する制限が設定済み【NGKI3444】
	E_PAR		パラメータエラー
				・mintpriが有効範囲外【NGKI3445】

【機能】

パラメータで指定した保護ドメインに対する制限の設定情報に従って，ユーザ
ドメインに対する制限を設定する【NGKI3446】．

mintpriは整数定数式パラメータである【NGKI3447】．

LMT_DOMにより保護ドメインに対する制限を設定しないユーザドメインに対して
は，指定できる最高のタスク優先度はTMIN_TPRI＋1に設定される【NGKI3448】．
----------------------------------------------------------------------
DEF_KMM		カーネルが割り付けるメモリ領域の設定〔SD〕

【静的API】
	DEF_KMM({ SIZE kmmsz, STK_T *kmm })

【パラメータ】
　＊カーネルが割り付けるメモリ領域の設定情報
	SIZE		kmmsz		カーネルが割り付けるメモリ領域のサイズ（バイト数）
	STK_T		kmm			カーネルが割り付けるメモリ領域の先頭番地

【エラーコード】
	E_RSATR		予約属性
				・カーネルドメインの囲みの中に記述されていない〔P〕
	E_PAR		パラメータエラー
				・kmmszが0以下
				・その他の条件については機能の項を参照
	E_OBJ		オブジェクト状態エラー
				・カーネルが割り付けるメモリ領域が設定済み

【機能】

各パラメータで指定したカーネルが割り付けるメモリ領域の設定情報に従って，
カーネルが割り付けるメモリ領域を設定する．

kmmszは整数定数式パラメータ，kmmは一般定数式パラメータである．

kmmをNULLとした場合，kmmszで指定したサイズのメモリ領域を，コンフィギュ
レータが確保する．kmmszにターゲット定義の制約に合致しないサイズを指定し
た時には，ターゲット定義の制約に合致するようにサイズを大きい方に丸めて
確保する．

カーネルが割り付けるメモリ領域をアプリケーションで確保する場合には，
kmmszで指定したサイズのメモリ領域を確保し，kmmにその先頭番地を指定する．

DEF_KMMによりカーネルが割り付けるメモリ領域を設定しない場合，カーネルが
割り付けるメモリ領域は確保されない．

kmmやkmmszにターゲット定義の制約に合致しない先頭番地やサイズを指定した
時には，E_PARエラーとなる．
----------------------------------------------------------------------

以上
