• 検索結果がありません。

可変長メモリプール

ドキュメント内 TEF021-S _ja (ページ 175-185)

第 4 章 SMP T-Kernel/OS の機能

4.6 メモリプール管理機能

4.6.2 可変長メモリプール

可変長メモリプールは、任意のサイズのメモリブロックを動的に管理するためのオブジェクトである。可変長メ モリプール機能には、可変長メモリプールを生成/削除する機能、可変長メモリプールに対してメモリブロックを 獲得/返却する機能、可変長メモリプールの状態を参照する機能が含まれる。可変長メモリプールは ID 番号で識別 されるオブジェクトである。可変長メモリプールの ID 番号を可変長メモリプール ID と呼ぶ。

可変長メモリプールは、可変長メモリプールとして利用するメモリ領域(これを可変長メモリプール領域、または 単にメモリプール領域と呼ぶ)と、メモリブロックの獲得を待つタスクの待ち行列を持つ。可変長メモリプールから メモリブロックを獲得するタスクは、メモリプール領域の空き領域が足りなくなった場合、十分なサイズのメモリ ブロックが返却されるまで可変長メモリブロックの獲得待ち状態となる。可変長メモリブロックの獲得待ち状態に なったタスクは、その可変長メモリプールの待ち行列につながれる。

SMP T-Kernel では、可変長メモリプールの ID を指定するシステムコールにはアクセス保護が適用される。

T-Kernel 1.00 仕様と仕様の異なるシステムコールについて、以下の表にまとめる。詳細は各システムコールの説 明を参照のこと。

コール名 機 能

T-Kernel 1.00仕様 との相違

tk_cre_mpl 可変長メモリプール生成 ×

tk_del_mpl 可変長メモリプール削除

tk_get_mpl 可変長メモリブロック獲得

tk_rel_mpl 可変長メモリブロック返却

tk_ref_mpl 可変長メモリプール状態参照

T-Kernel 1.00 仕様との相違 ○:無し ×:有り △:アクセス保護で E_DACV エラーが返る点のみ異なる

【補足事項】

可変長メモリプールでメモリブロックの獲得を待っているタスクは、待ち行列につながれている順序でメモリブ ロックを獲得する。例えば、ある可変長メモリプールに対して 400 バイトのメモリブロックを獲得しようとしてい るタスク A と、100 バイトのメモリブロックを獲得しようとしているタスク B が、この順で待ち行列につながれてい る時に、別のタスクからのメモリブロックの返却により 200 バイトの連続空きメモリ領域ができたとする。このよ うな場合でも、タスク A がメモリブロックを獲得するまで、タスク B はメモリブロックを獲得できない。

Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.

可変長メモリプール生成 tk_cre_mpl

tk_cre_mpl:Create Variable-size MemoryPool

【C 言語インタフェース】

ID mplid = tk_cre_mpl ( T_CMPL *pk_cmpl ) ;

【パラメータ】

T_CMPL* pk_cmpl Packet to Create MemoryPool 可変長メモリプール生成情報

pk_cmpl の内容

VP exinf ExtendedInformation 拡張情報

ATR mplatr MemoryPoolAttribute メモリプール属性

INT mplsz MemoryPoolSize メモリプール全体のサイズ(バイト数) ID domid DomainID ドメイン ID

UB oname[8] Object name オブジェクト名称 ──(以下に実装独自に他の情報を追加してもよい)──

【リターンパラメータ】

ID mplid MemoryPoolID 可変長メモリプール ID または ErrorCode エラーコード

【エラーコード】

E_NOMEM メモリ不足(管理ブロックやメモリプール用の領域が確保できない) E_LIMIT 可変長メモリプールの数がシステムの上限を超えた

E_RSATR 予約属性(mplatr が不正あるいは利用できない)

E_PAR パラメータエラー(pk_cmpl が不正,mplsz が負または不正) E_ID 不正 ID 番号(domid が不正あるいは利用できない)

E_NOEXS オブジェクトが存在していない(domid のドメインが存在しない) E_NSPT 未サポート(プロセッサ間共有メモリを持たない)

E_ONAME 指定されたオブジェクト名が既に使用されている

【解説】

可変長メモリプールを生成し可変長メモリプール ID を割当てる。具体的には、mplsz の情報を元に、メモリプー ルとして利用するメモリ領域を確保する。また、生成したメモリプールに対して管理ブロックを割り付ける。

exinf は、対象メモリプールに関する情報を入れておくためにユーザが自由に利用できる。ここで設定した情報は、

tk_ref_mpl で取り出すことができる。なお、ユーザの情報を入れるためにもっと大きな領域がほしい場合や、途中 で内容を変更したい場合には、自分でそのためのメモリを確保し、そのメモリパケットのアドレスを exinf に入れ る。OS では exinf の内容について関知しない。

mplatr は、下位側がシステム属性を表わし、上位側が実装独自属性を表す。mplatr のシステム属性の部分では、

次のような指定を行う。

mplatr:= (TA_TFIFO ∥ TA_TPRI) | [TA_ONAME] | [TA_NODISWAI]

| (TA_RNG0 ∥ TA_RNG1 ∥ TA_RNG2 ∥ TA_RNG3)

| [TA_DOMID] | [(TA_PROTECTED || TA_PRIVATE || TA_PUBLIC)]

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 であればタスクの待ち行列 はタスクの優先度順となる。

タスクがメモリ獲得待ちの行列を作った場合は、待ち行列先頭のタスクに優先してメモリを割当てる。待ち行列 の2番目以降により少ないメモリサイズを要求しているタスクがあった場合も、そのタスクが先にメモリを獲得す ることはない。例えば、ある可変長メモリプールに対して要求メモリサイズ=400 のタスク A と要求メモリサイズ=

100 のタスク B がこの順で待っており、別のタスクの tk_rel_mpl によりメモリサイズ=200 の連続空きメモリ領域 ができたとする。このとき、行列の先頭ではないが要求サイズの少ないタスク B が先にメモリを獲得することはな い。

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 /* 保護属性をパブリックに設定 */

【補足事項】

メモリ獲得待ち行列の先頭のタスクの待ちが強制解除されたり、タスク優先度が変更されるなどで待ち行列の順 序が変化した場合は、新たに待ち行列の先頭になったタスクに対してメモリ割当てが試みられる。メモリを割当て ることができれば、そのタスクの待ちは解除される。したがって、tk_rel_mpl によるメモリの解放がなくても、状

Copyright © 2006-2017 T-Engine Forum. All Rights Reserved.

況によってはメモリの獲得が行われ、待ちが解除される場合がある。

MMU のないシステムにおいても、移植性確保のために TA_RNGn 属性を受け付けなければならない。例えば、TA_RNGn の指定はすべて TA_RNG0 相当として処理してもよいが、エラーとはしない。

【SMP T-Kernel に関する事項】

T-Kernel 1.00 仕様との相違点は以下の通りである。

 メモリプール属性に TA_DOMID,TA_PROTECTED, TA_PRIVATE, TA_PUBLIC を追加し、所属するドメインとアクセ ス保護属性を指定可能とした。

 DS オブジェクト名を廃し、代わりにオブジェクト名を設けた。前者はデバッグのための名称であったのに対 し、後者はドメインの ID 検索など一般に使用可能な名称である。オブジェクト名は、同一ドメイン内の同一 の種類のオブジェクトで同じ名称を使用することは出来ない。

【仕様決定の理由】

複数個のメモリプールを設ける機能は、エラー処理時や緊急時などにメモリを確保するためのメモリプールを分 離しておくために利用できる。

ドキュメント内 TEF021-S _ja (ページ 175-185)