第 4 章 SMP T-Kernel/OS の機能
4.6 メモリプール管理機能
4.6.1 固定長メモリプール
固定長メモリプールは、固定されたサイズのメモリブロックを動的に管理するためのオブジェクトである。固定 長メモリプール機能には、固定長メモリプールを生成/削除する機能、固定長メモリプールに対してメモリブロッ クを獲得/返却する機能、固定長メモリプールの状態を参照する機能が含まれる。固定長メモリプールは ID 番号で 識別されるオブジェクトである。固定長メモリプールの ID 番号を固定長メモリプール ID と呼ぶ。
固定長メモリプールは、固定長メモリプールとして利用するメモリ領域(これを固定長メモリプール領域、または 単にメモリプール領域と呼ぶ)と、メモリブロックの獲得を待つタスクの待ち行列を持つ。固定長メモリプールから メモリブロックを獲得するタスクは、メモリプール領域に空きがなくなった場合、次にメモリブロックが返却され るまで固定長メモリブロックの獲得待ち状態となる。固定長メモリブロックの獲得待ち状態になったタスクは、そ の固定長メモリプールの待ち行列につながれる。
SMP T-Kernel では、固定長メモリプールの ID を指定するシステムコールにはアクセス保護が適用される。
T-Kernel 1.00 仕様と仕様の異なるシステムコールについて、以下の表にまとめる。詳細は各システムコールの説 明を参照のこと。
コール名 機 能
T-Kernel 1.00仕様 との相違
tk_cre_mpf 固定長メモリプール生成 ×
tk_del_mpf 固定長メモリプール削除 △
tk_get_mpf 固定長メモリブロック獲得 △
tk_rel_mpf 固定長メモリブロック返却 △
tk_ref_mpf 固定長メモリプール状態参照 △
T-Kernel 1.00 仕様との相違 ○:無し ×:有り △:アクセス保護で E_DACV エラーが返る点のみ異なる
【補足事項】
固定長メモリプールの場合、何種類かのサイズのメモリブロックが必要となる場合には、サイズ毎に複数のメモ リプールを用意する必要がある。
固定長メモリプール生成 tk_cre_mpf
tk_cre_mpf:Create Fixed-size MemoryPool
【C 言語インタフェース】
ID mpfid = tk_cre_mpf ( T_CMPF *pk_cmpf ) ;
【パラメータ】
T_CMPF* pk_cmpf Packet to Create MemoryPool 固定長メモリプール生成情報
pk_cmpf の内容
VP exinf ExtendedInformation 拡張情報
ATR mpfatr MemoryPoolAttribute メモリプール属性
INT mpfcnt MemoryPoolBlockCount メモリプール全体のブロック数
INT blfsz MemoryBlockSize 固定長メモリブロックサイズ(バイト数) ID domid DomainID ドメイン ID
UB oname[8] Object name オブジェクト名称 ──(以下に実装独自に他の情報を追加してもよい)──
【リターンパラメータ】
ID mpfid MemoryPoolID 固定長メモリプール ID または ErrorCode エラーコード
【エラーコード】
E_NOMEM メモリ不足(管理ブロックやメモリプール用の領域が確保できない) E_LIMIT 固定長メモリプールの数がシステムの上限を超えた
E_RSATR 予約属性(mpfatr が不正あるいは利用できない)
E_PAR パラメータエラー(pk_cmpf が不正,mpfcnt,blfsz が負または不正) E_ID 不正 ID 番号(domid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(domid のドメインが存在しない) E_ONAME 指定されたオブジェクト名が既に使用されている
【解説】
固定長メモリプールを生成し固定長メモリプール ID を割当てる。具体的には、mpfcnt,blfsz の情報を元に、メモ リプールとして利用するメモリ領域を確保する。また、生成したメモリプールに対して管理ブロックを割り付ける。
ここで生成されたメモリプールに対して tk_get_mpf システムコールを発行することにより、blfsz のサイズ(バイト 数)をもつメモリブロックを獲得することができる。
exinf は、対象メモリプールに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、
tk_ref_mpf で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中 で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れ る。OS では exinf の内容について関知しない。
mpfatr は、下位側がシステム属性を表わし、上位側が実装独自属性を表す。mpfatr のシステム属性の部分では、
次のような指定を行う。
mpfatr:= (TA_TFIFO ∥ TA_TPRI) | [TA_ONAME] | [TA_NODISWAI]
| (TA_RNG0 ∥ TA_RNG1 ∥ TA_RNG2 ∥ TA_RNG3)
| [TA_DOMID] | [(TA_PROTECTED || TA_PRIVATE || TA_PUBLIC)]
Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.
TA_TFIFO メモリ獲得待ちタスクのキューイングは FIFO TA_TPRI メモリ獲得待ちタスクのキューイングは優先度順 TA_RNGn メモリのアクセス制限を保護レベル n とする TA_ONAME オブジェクト名称を指定する
TA_NODISWAI tk_dis_wai による待ち禁止を拒否する TA_DOMID 所属するドメインを指定する
TA_PROTECTED アクセス保護属性をプロテクトに設定する TA_PRIVATE アクセス保護属性をプライベートに設定する TA_PUBLIC アクセス保護属性をパブリックに設定する
TA_TFIFO,TA_TPRI では、タスクがメモリ獲得のためにメモリプールの待ち行列に並ぶ際の並び方を指定すること ができる。属性が TA_TFIFO であればタスクの待ち行列は FIFO となり、属性が TA_TPRI であればタスクの待ち行列 はタスクの優先度順となる。
TA_RNGn では、メモリのアクセスを制限する保護レベルを指定する。指定された保護レベルと同じかより高い保護 レベルで実行しているタスクからのみアクセス可能である。低いレベルで実行しているタスクがアクセスすると CPU の保護違反の例外が発生する。例えば、TA_RNG1 を指定して作成したメモリプールから獲得したメモリは、TA_RNG0,1 で動作しているタスクからはアクセス可能だが、TA_RNG2,3 で動作しているタスクからはアクセスできない。
作成されるメモリプールは、共有空間上の常駐メモリとなる。タスク固有空間上にメモリプールを作成する機能 はない。
TA_ONAME を指定した場合に oname が有効となり、オブジェクト名称として設定される。TA_ONAME を指定しなか った場合、オブジェクト名称は設定無しとなる。オブジェクト名称は、メモリプールが所属するドメイン内で固有 でなくてはならない。既に他のメモリプールで使用されているオブジェクト名称を指定した場合はエラーE_ONAME が返される。oname に指定された文字列の長さが 0(最初の文字が終端の 0)の場合は、TA_ONAME の指定に関わらずオ ブジェクト名称は設定無しとみなされる。
TA_DOMID を指定した場合は、domid が有効となり、所属するドメインとして domid のドメインが設定される。
TA_DOMID を指定しなかった場合は、domid は無視され、カーネル・ドメインが所属するドメインとなる。
TA_PROTECTED, TA_PRIVATE, TA_PUBLIC は、メモリプールのアクセス保護属性を指定する。いずれのアクセス保護 属性も指定されなかった場合は、パブリック属性に設定される。所属するドメインとアクセス保護属性の組み合わ せにより、自タスクがアクセス保護によりアクセスできないメモリプールを生成する事はできない。該当する指定 をした場合は E_PAR が返される。
#define TA_TFIFO 0x00000000 /* 待ちタスクを FIFO で管理 */
#define TA_TPRI 0x00000001 /* 待ちタスクを優先度順で管理 */
#define TA_ONAME 0x00000040 /* オブジェクト名称を指定 */
#define TA_NODISWAI 0x00000080 /* 待ち禁止拒否 */
#define TA_RNG0 0x00000000 /* 保護レベル 0 */
#define TA_RNG1 0x00000100 /* 保護レベル 1 */
#define TA_RNG2 0x00000200 /* 保護レベル 2 */
#define TA_RNG3 0x00000300 /* 保護レベル 3 */
#define TA_DOMID 0x00010000 /* ドメインを指定する */
#define TA_PRIVATE 0x00040000 /* 保護属性をプライベートに設定 */
#define TA_PROTECTED 0x00080000 /* 保護属性をプロテクトに設定 */
#define TA_PUBLIC 0x00000000 /* 保護属性をパブリックに設定 */
【補足事項】
固定長メモリプールの場合、ブロックサイズを変えるためには別のメモリプールを用意しなければならない。す なわち、何種類かのメモリブロックサイズが必要となる場合は、サイズごとに複数のメモリプールを設ける必要が ある。
MMU のないシステムにおいても、移植性確保のために TA_RNGn 属性を受け付けなければならない。例えば、TA_RNGn の指定はすべて TA_RNG0 相当として処理してもよいが、エラーとはしない。
【SMP T-Kernel に関する事項】
T-Kernel 1.00 仕様との相違点は以下の通りである。
メモリプール属性に TA_DOMID,TA_PROTECTED, TA_PRIVATE, TA_PUBLIC を追加し、所属するドメインとアクセ ス保護属性を指定可能とした。
DS オブジェクト名を廃し、代わりにオブジェクト名を設けた。前者はデバッグのための名称であったのに対 し、後者はドメインの ID 検索など一般に使用可能な名称である。オブジェクト名は、同一ドメイン内の同一 の種類のオブジェクトで同じ名称を使用することは出来ない。
Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.
固定長メモリプール削除 tk_del_mpf
tk_del_mpf:Delete Fixed-size MemoryPool
【C 言語インタフェース】
ER ercd = tk_del_mpf ( ID mpfid ) ;
【パラメータ】
ID mpfid MemoryPoolID 固定長メモリプール ID
【リターンパラメータ】
ER ercd ErrorCode エラーコード
【エラーコード】
E_OK 正常終了
E_ID 不正 ID 番号(mpfid が不正あるいは利用できない)
E_NOEXS オブジェクトが存在していない(mpfid の固定長メモリプールが存在しない) E_DACV アクセス保護違反
【解説】
mpfid で示される固定長メモリプールを削除する。
このメモリプールからメモリを獲得しているタスクが存在しても、そのチェックや通知は行われない。すべての メモリブロックが返却されていなくても、このシステムコールは正常終了する。
本システムコールの発行により、対象メモリプールの ID 番号および管理ブロック用の領域やメモリプール本体の 領域は解放される。
対象メモリプールにおいてメモリ獲得を待っているタスクがあった場合にも、本システムコールは正常終了する が、待ち状態にあったタスクにはエラーE_DLT が返される。
本システムコールはアクセス保護が適用される。
【SMP T-Kernel に関する事項】
T-Kernel 1.00 仕様との相違点は以下の通りである。
指定したメモリプールがアクセス保護によりアクセスできない場合、E_DACV が返る。