(57)【要約】  第２メモリ１３０は、セグメント単位でデータを保持する。割当制御回路１２０は、論理アドレス空間としてのバッファ空間を設定する。このバッファ空間は１以上のセグメントの集合として形成される。状態保持回路１２６は、バッファ空間とセグメントとの対応関係をセグメント割当情報として保持する。アドレス変換回路１２８は、このセグメント割当情報を参照して、論理アドレスを物理アドレスに変換する。セグメントキューは空きセグメント、バッファキューは空きバッファを保持する。状態保持回路１２６は、複数個のセグメントレジスタを含むレジスタグループを複数グループ含む。レジスタグループは複数のバッファ空間のいずれかと対応づけられている。セグメントレジスタには該当バッファ空間における論理アドレス範囲のうちの所定範囲を特定する範囲番号が設定されている。
2008084531.tif 000002
【特許請求の範囲】
【請求項１】
１以上のタスクを実行する実行制御回路と、
複数のセグメントに分割され、セグメント単位にてデータを保持するメモリと、
論理アドレス空間であるバッファ空間に関し、複数のバッファ空間のうちいずれかのバッファ空間についてのバッファＩＤをタスクに割り当てる割当制御回路と、
バッファ空間における論理アドレスを物理アドレスに変換するアドレス変換回路と、
バッファＩＤとセグメントＩＤの対応付けによりバッファ空間とセグメントとの対応関係をセグメント割当情報として保持する状態保持回路と、
前記複数のセグメントのうち、新たな割り当てが許可される状態にあるセグメントのセグメントＩＤを保持するセグメントキューと、
前記複数のバッファ空間のうち、新たな割り当てが許可される状態にあるバッファ空間のバッファＩＤを保持するバッファキューと、を備え、
前記状態保持回路は、複数個のセグメントレジスタを含むレジスタグループを複数グループ含み、レジスタグループは前記複数のバッファ空間のいずれかと対応づけられ、更に、セグメントレジスタには該当バッファ空間における論理アドレス範囲のうちの所定範囲を特定する範囲番号が設定されており、
前記割当制御回路は、１以上のセグメントを含むバッファ空間の割り当てを指示するバッファ取得要求を入力されたとき、前記バッファキューと前記セグメントキューからそれぞれバッファＩＤと１以上のセグメントＩＤを取得し、取得したバッファＩＤに対応するレジスタグループにおいて、取得した１以上のセグメントＩＤを１以上のセグメントレジスタにそれぞれ登録することにより、バッファ空間とセグメントとの対応関係を前記状態保持回路に設定し、
前記アドレス変換回路は、論理アドレスによりアクセス先を指定するアクセス要求を入力されたとき、前記状態保持回路から出力される前記セグメント割当情報を参照して、アクセス要求元のタスクに対応するレジスタグループにおいて、指定された論理アドレスに対応する範囲番号を特定し、その範囲番号に対応するセグメントレジスタに保持されているセグメントＩＤを取得し、そのセグメントＩＤに対応する物理アドレスを特定することにより、論理アドレスを物理アドレスに変換することを特徴とするメモリ管理装置。
【請求項２】
前記割当制御回路は、バッファ空間の解放を指示する全解放要求を入力されたとき、前記全解放要求において指定されたバッファＩＤに対応するレジスタグループにおいて、各セグメントレジスタに登録されているセグメントＩＤを無効化するとともに、前記指定されたバッファＩＤを前記バッファキューに投入し、前記無効化されたセグメントＩＤを前記セグメントキューに投入することにより、前記全解放要求にて指定されたバッファ空間とそのバッファ空間に対応づけられていたセグメントを再割当許可状態に設定することを特徴とする請求項１に記載のメモリ管理装置。
【請求項３】
前記割当制御回路は、バッファ空間の一部の解放を指示する部分解放要求を入力されたとき、前記部分解放要求において指定されたバッファＩＤに対応するレジスタグループにおいて、前記部分解放要求において指定された論理アドレスよりも所定バイト前の論理アドレスに対応する範囲番号を特定し、その範囲番号に対応する論理アドレス範囲以降の論理アドレスに対応する範囲番号にて示されるセグメントを無効化し、前記無効化されたセグメントＩＤを前記セグメントキューに投入することにより、前記部分解放要求にて指定された論理アドレス以降に対応づけられているセグメントを再割当許可状態に設定することを特徴とする請求項１に記載のメモリ管理装置。
【請求項４】
前記割当制御回路は、第１のバッファ空間への第２のバッファ空間のデータの移行を指示するセグメント移行要求を入力されたとき、前記第１のバッファ空間に対応するレジスタグループのセグメントレジスタに対して前記第２のバッファ空間に対応するレジスタグループにおいて有効に登録されているセグメントＩＤを追加登録することにより、前記第２のバッファ空間に対応するセグメントを前記第１のバッファ空間に対応づけることを特徴とする請求項１に記載のメモリ管理装置。
【請求項５】
前記割当制御回路は、前記セグメント移行要求を入力されたときには、更に、前記第２のバッファ空間に対応するレジスタグループにおける各セグメントレジスタのセグメントＩＤを無効化し、前記第２のバッファ空間に対応するバッファＩＤを前記バッファキューに投入し、前記無効化されたセグメントＩＤを前記セグメントキューに投入することにより、前記第２のバッファ空間を再割当許可状態に設定することを特徴とする請求項４に記載のメモリ管理装置。
【請求項６】
前記状態保持回路のレジスタグループには、更に、バッファＩＤを保持するためのバッファレジスタが含まれ、
前記状態保持回路は、
バッファレジスタとセグメントレジスタに保持されるデータを退避させるための退避メモリと、
退避メモリからレジスタグループへのデータロードを実行する退避制御回路と、を含み、
前記退避制御回路は、アクセス先となるバッファ空間のデータがレジスタグループに存在しないときには、前記退避メモリにおいてアクセス先となるバッファ空間のデータを前記レジスタグループにロードすることを特徴とする請求項１に記載のメモリ管理装置。
【請求項７】
セグメントレジスタは、更に、該当セグメントにおいてデータが書き込まれている範囲を示す記録状態情報を保持し、
前記アドレス変換回路は、前記アクセス要求を入力されたとき、記録状態情報を参照して、範囲番号と論理アドレス範囲との対応関係を調整することを特徴とする請求項１に記載のメモリ管理装置。
【請求項８】
１以上のバッファ空間を連結することにより一の論理アドレス空間として形成される連結空間に関し、複数の連結空間のうち、新たな割り当てが許可される状態にある連結空間の連結ＩＤを保持する連結空間キュー、を更に備え、
前記状態保持回路のレジスタグループには、バッファ空間が属する連結空間の連結ＩＤとその連結空間の論理アドレス範囲のうち前記バッファ空間が対応する論理アドレス範囲を示す位置番号を保持するリンクレジスタが含まれ、
前記割当制御回路は、前記バッファ取得要求を入力されたとき、バッファＩＤとセグメントＩＤに加えて、前記連結空間キューから連結ＩＤを取得し、取得したバッファＩＤに対応するレジスタグループのリンクレジスタに連結ＩＤと位置番号を登録することにより、連結空間とバッファ空間との対応関係を設定し、
前記割当制御回路は、連結空間への新たなバッファ空間の追加を指示するバッファリンク要求を入力されたとき、前記バッファキューからバッファＩＤを取得し、取得したバッファＩＤに対応するレジスタグループのリンクレジスタに前記バッファリンク要求において指定された連結ＩＤと位置番号を登録することにより、連結空間に新たなバッファ空間を追加し、
前記アドレス変換回路は、前記アクセス要求を入力されたとき、アクセス要求元のタスクによりアクセス対象となるレジスタグループとして、前記アクセス要求において指定された連結ＩＤと位置番号を保持するレジスタグループを特定することを特徴とする請求項１に記載のメモリ管理装置。
【請求項９】
複数のセグメントに分割されたメモリに対するＣＰＵ（Central Processing Unit）のアクセスを制御するための装置であって、
第１のバスを介して前記ＣＰＵと接続され、論理アドレス空間であるバッファ空間に関し、複数のバッファ空間のうちいずれかのバッファ空間についてのバッファＩＤをタスクに割り当てる割当制御回路と、
前記割当制御回路と第２のバスを介して接続され、バッファＩＤとセグメントＩＤの対応付けによりバッファ空間とセグメントとの対応関係をセグメント割当情報として保持する状態保持回路と、
前記ＣＰＵのアドレスバスと接続され、かつ、前記状態保持回路と第３のバスを介して接続される回路であって、バッファ空間における論理アドレスを物理アドレスに変換するアドレス変換回路と、
前記割当制御回路と第４のバスを介して接続され、前記複数のセグメントのうち、データ書込が許可される状態にあるセグメントのセグメントＩＤを保持するセグメントキューと、
前記割当制御回路と第５のバスを介して接続され、前記複数のバッファ空間のうち、新たな割り当てが許可される状態にあるバッファ空間のバッファＩＤを保持するバッファキューと、を備え、
前記状態保持回路は、複数個のセグメントレジスタを含むレジスタグループを複数グループ含み、レジスタグループは前記複数のバッファ空間のいずれかと対応づけられ、更に、セグメントレジスタには該当バッファ空間における論理アドレス範囲のうちの所定範囲を特定する範囲番号が設定されており、
前記割当制御回路は、前記ＣＰＵから前記第１のバスを介して１以上のセグメントを含むバッファ空間の割り当てを指示するバッファ取得要求を入力されたとき、前記第４のバスおよび前記第５のバスを介して、前記バッファキューと前記セグメントキューからそれぞれバッファＩＤと１以上のセグメントＩＤを取得し、前記第２のバスを介して、取得したバッファＩＤに対応するレジスタグループの１以上のセグメントレジスタにセグメントＩＤを記録し、
前記アドレス変換回路は、前記ＣＰＵから前記アドレスバスに送出された論理アドレスを入力されたとき、前記状態保持回路から前記第３のバスを介して出力される前記セグメント割当情報により、アクセス要求元のタスクに対応するバッファ空間において、指定された論理アドレスに対応する範囲番号を特定し、その範囲番号に対応するセグメントレジスタに保持されているセグメントＩＤを特定し、そのセグメントＩＤに対応する物理アドレスを特定することにより、論理アドレスを物理アドレスに変換することを特徴とするメモリ管理装置。  
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、メモリ管理技術に関する。
【背景技術】
【０００２】
ＣＰＵ（Central Processing Unit）をはじめとする電子デバイスの高機能化・低価格化にともなって、携帯電話のような組込システム（Enbeded System）にも高度なＯＳ（Operating System）が搭載されつつある。システムの性能や用途に応じてＯＳに求められる機能はさまざまであるが、その中核となるのは「メモリ管理機能」である。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
通常、筐体サイズや製造コストなどの制約から、搭載できるメモリの容量には限度がある。組込システムでは特に制約が厳しく、限られたメモリ資源を効率的に利用する必要がある。また、決められた時間内に処理が完了することを厳密に要求するシステムも多い。時間的要件の厳しいシステムの場合、メモリ管理処理にともなうオーバヘッドはシステム全体のパフォーマンスに大きく影響する。【０００４】
本発明は、上記課題に鑑みてなされたものであり、その主たる目的は、高速かつ効率的なメモリ管理機能を実現するための技術、を提供することにある。
【特許文献１】特開２００３−３１６６４５号公報
【課題を解決するための手段】
【０００５】
本発明のある態様は、メモリ管理装置である。
この装置は、１以上のタスクを実行する実行制御回路と、セグメント単位でデータを保持するメモリと、論理アドレスによりアクセスされるバッファ空間をタスクに割り当てる割当制御回路と、論理アドレスを物理アドレスに変換するアドレス変換回路と、バッファ空間とセグメントとの対応関係をセグメント割当情報として保持する状態保持回路と、セグメントキューおよびバッファキューを備える。
状態保持回路は、複数のレジスタグループを含み、レジスタグループは複数個のセグメントレジスタを含む。レジスタグループは複数のバッファ空間のいずれかと対応づけられる。セグメントレジスタには該当バッファ空間における論理アドレス範囲のうちの所定範囲を特定する範囲番号が設定されている。
割当制御回路は、バッファ取得要求を入力されたとき、バッファキューとセグメントキューからそれぞれバッファＩＤと１以上のセグメントＩＤを取得し、取得したバッファＩＤに対応するレジスタグループにおいて、取得した１以上のセグメントＩＤを１以上のセグメントレジスタにそれぞれ登録することにより、バッファ空間とセグメントとの対応関係を状態保持回路に設定する。バッファＩＤとはバッファ空間を一意に識別するためのＩＤであり、セグメントＩＤとはセグメントを一意に識別するためのＩＤである。
アドレス変換回路は、メモリに対するアクセス要求を入力されたとき、セグメント割当情報を参照して、アクセス要求元のタスクに対応するレジスタグループにおいて、指定された論理アドレスに対応する範囲番号を特定し、その範囲番号に対応するセグメントレジスタに保持されているセグメントＩＤを取得し、そのセグメントＩＤに対応する物理アドレスを特定することにより、論理アドレスを物理アドレスに変換する。【０００６】
このような態様によれば、タスクにバッファ空間を割り当て、バッファ空間にセグメントを割り当て、論理アドレスを物理アドレスに変換してメモリへのアクセスを実現するという一連の処理をハードウェアロジックにより実現できる。これにより、ソフトウェアＯＳに比べて高速にメモリ管理処理を実行しやすくなる。また、バッファ空間をセグメント単位で取り扱うことにより、メモリの利用率を高めることができる。【０００７】
なお、以上の構成要素の任意の組合せ、本発明を方法、システム、記録媒体、コンピュータプログラムにより表現したものもまた、本発明の態様として有効である。
【発明の効果】
【０００８】
本発明によれば、高速かつ効率的なメモリ管理機能を実現できる。
【図面の簡単な説明】
【０００９】
【図１】一般的なメモリ管理方法の一つとして自由割当方式を説明するための模式図である。
【図２】一般的なメモリ管理方法の一つとして固定割当方式を説明するための模式図である。
【図３】本実施例におけるメモリ管理方法を説明するための模式図である。
【図４】本実施例におけるメモリ管理装置の回路図である。
【図５】論理アドレスADDと物理アドレスM2ADのデータ構造を示す図である。
【図６】物理アドレスADDと物理アドレスM2ADの対応関係を示す図である。
【図７】基本例に関して、割当制御回路とその周辺の回路構成を示す図である。
【図８】基本例における状態保持回路の回路構成図である。
【図９】状態保持回路において、セグメントレジスタのデータ保持状態を示す図である。
【図１０】基本例におけるアドレス変換回路の回路構成図である。
【図１１】基本例におけるアドレス変換処理の処理過程を示すフローチャートである。
【図１２】基本例におけるバッファ取得処理の処理過程を示すフローチャートである。
【図１３】基本例におけるバッファ全解放処理の処理過程を示すフローチャートである。
【図１４】バッファ部分解放処理の内容を説明するための模式図である。
【図１５】基本例におけるバッファ部分解放処理の処理過程を示すフローチャートである。
【図１６】セグメント移行処理の内容を説明するための模式図である。
【図１７】基本例におけるセグメント移行処理の処理過程を示すフローチャートである。
【図１８】基本例に関し、キャッシュコントロール機能を搭載した状態保持回路の回路構成図である。
【図１９】セグメント移行処理における課題について説明するための模式図である。
【図２０】移行改良例に関して、セグメント移行処理後も論理アドレスを連続させる方法を説明するための模式図である。
【図２１】移行改良例に関して、割当制御回路とその周辺の回路構成を示す図である。
【図２２】移行改良例におけるアドレス変換回路の回路構成図である。
【図２３】移行改良例における位置検出回路の回路構成図である。
【図２４】移行改良例におけるアドレス変換処理の処理過程を示すフローチャートである。
【図２５】移行改良例におけるセグメント移行処理の内容を説明するための模式図である。
【図２６】ＴＣＰ／ＩＰによるデータ送信に関して、バッファ連結処理を説明するために模式図である。
【図２７】ＴＣＰ／ＩＰによるデータ受信に関して、バッファ連結処理を説明するための模式図である。
【図２８】連結空間におけるLBIDとLBSNの関係を説明するための模式図である。
【図２９】連結改良例における論理アドレスADDと物理アドレスM2ADのデータ構造を示す図である。
【図３０】連結改良例において、割当制御回路とその周辺の回路構成を示す図である。
【図３１】連結改良例におけるバッファＩＤ検索回路の回路構成図である。
【図３２】連結改良例における状態保持回路の回路構成図である。
【図３３】連結改良例におけるアドレス変換回路の回路構成図である。
【図３４】連結改良例におけるアドレス変換処理の処理過程を示すフローチャートである。
【図３５】連結改良例におけるバッファ取得処理の処理過程を示すフローチャートである。
【図３６】連結改良例におけるバッファ連結処理の処理過程を示すフローチャートである。
【図３７】連結改良例におけるバッファ全解放処理の処理過程を示すフローチャートである。
【図３８】連結改良例に関し、キャッシュコントロール機能を搭載した状態保持回路の回路構成図である。
【図３９】図３８の状態保持回路のキャッシュコントロール機能に対応するバッファＩＤ検索回路の回路構成図である。
【発明を実施するための最良の形態】
【００１０】
本実施例に示すメモリ管理装置１００は、ＯＳのメモリ管理機能を電子回路により実現している。まず、図１および図２に関連して、一般的なメモリ管理方法の概要を説明した上でその問題点を指摘する。その上で、図３に関連して、本実施例におけるメモリ管理方法の概要を説明する。更に、図４以降においては、メモリ管理装置１００の回路構成や処理内容の詳細について説明する。
メモリ管理装置１００の基本構成を「基本例」として説明したあと、その機能の一部を拡張・変更した２種類の「改良例」についても説明する。【００１１】
図１は、一般的なメモリ管理方法の一つとして自由割当方式を説明するための模式図である。
ここでいう「メモリ」とは、厳密にはヒープメモリ（heap memory）である。同図においては、以下のような経過にてヒープメモリの確保および解放がなされた場合を示している。
時刻ｔ１：ヒープメモリが初期化される。ヒープメモリはすべて空き領域となっている。
時刻ｔ２：１以上のタスクが開始される。タスクによるメモリの取得要求に基づいて、ＯＳは、Ａ〜Ｅの５つの領域を確保する。以下、同図において「Ａ」と表記されている領域のことを「割当領域（Ａ）」と表記する。同図斜線で示す部分は割当領域であることを示す。
時刻ｔ３：タスクの実行過程において、タスクによるメモリの解放要求に基づいて、ＯＳは割当領域（Ｂ）と割当領域（Ｄ）を解放する。一方、ＯＳは、新たなメモリ取得要求に基づいて、割当領域（Ｆ）と割当領域（Ｇ）をヒープメモリに確保する。
時刻ｔ４：タスクの実行過程において、ＯＳは割当領域（Ａ）を解放する。一方、ＯＳは、割当領域（Ｈ）、割当領域（Ｉ）および割当領域（Ｊ）をヒープメモリに確保する。【００１２】
同図に示す自由割当方式の場合、割当領域を確保するために必要なだけの空き領域を探し出す必要があるが、メモリの確保と解放が繰り返されていくうちに空き領域が細分化してしまう。そのため、必要なサイズの割当領域の確保に失敗しやすくなる。一度電源を投入すると、何年間も初期化されることのない通信系アプリケーションでは、このような問題が特に顕在化しやすい。【００１３】
図２は、一般的なメモリ管理方法の一つとして固定割当方式を説明するための模式図である。
固定割当方式においては、ヒープメモリはあらかじめ固定長の「単位領域」に分割される。同図においては、ヒープメモリは５つの単位領域に分割されている。時刻ｔ１においてヒープメモリは初期化されており、５つの単位領域はすべて空き領域である。そして、時刻ｔ２に１以上のタスクにより４つの割当領域が要求されている。ＯＳは、割当領域（Ａ）、割当領域（Ｂ）、割当領域（Ｃ）、割当領域（Ｄ）を別々の単位領域に確保する。固定割当方式では、１つの単位領域には１つの割当領域を確保可能となっている。【００１４】
同図に示す固定割当方式は、少なくとも、５つ分の割当領域の確保は保証されるので、割当領域の数が５つ以内であることが確実なシステムでは有効な手法である。ただし、割当領域のサイズは単位領域のサイズにより制約を受ける。また、割当領域のサイズが小さい場合であっても、事実上、単位領域一つ分の領域を占有してしまうため、メモリ利用効率が悪くなる。【００１５】
図３は、本実施例におけるメモリ管理方法を説明するための模式図である。
本実施例に示すメモリ管理方法では、２５６バイト程度の「セグメント」を単位としてヒープメモリを管理する。ヒープメモリは、あらかじめ、複数のセグメントに分割され、各セグメントには「セグメントＩＤ（以下、「SegID」と表記する。）」とよばれるＩＤが付与される。同図に示すセグメントのサイズは２５６バイトである。そのため、SegID(0)のセグメント（以下、「セグメント（ＩＤ：０）」と表記する。）は、物理アドレス「０ｘ００００〜０ｘ００ＦＦ」に対応する。また、セグメント（ＩＤ：１）は、物理アドレス「０ｘ０１００〜０ｘ０１ＦＦ」に対応する。このように、SegIDによってヒープメモリの物理アドレスの範囲が特定される。【００１６】
ここで、割当領域（Ｈ）、割当領域（Ｉ）、割当領域（Ｊ）、割当領域（Ｎ）、割当領域（Ｍ）という５つの割当領域を確保する。割当領域（Ｈ）は、セグメント（ＩＤ：０）、セグメント（ＩＤ：２）、セグメント（ＩＤ：３）という３つのセグメントから構成される。割当領域（Ｈ）は、物理アドレスとしては必ずしも連続しない。割当領域が物理アドレスとして連続する必要がないため、任意の空きセグメントを追加するだけで割当領域のサイズを拡大できる。自由割当方式や固定割当方式では、「空き領域でありながら割当領域に設定できない領域」が大きくなりやすいという問題があった。しかし、本実施例におけるメモリ管理方式によれば、セグメントという小さな単位にて空き領域を管理することによりメモリ利用率を格段に向上させることができる。【００１７】
ただし、割当領域の物理アドレスが連続しなくなると、タスクがアクセス先の物理アドレスを特定するのが難しくなる。そこでこのような難点を解決するために、割当領域において連続する論理アドレスを定義する。たとえば、割当領域（Ｈ）において、セグメント（Ｈ１）は論理アドレス「０ｘ００００〜０ｘ００ＦＦ」、セグメント（Ｈ２）は論理アドレス「０ｘ０１００〜０ｘ０１ＦＦ」、セグメント（Ｈ３）は論理アドレス「０ｘ０２００〜０ｘ０２ＦＦ」に対応づける。実際の物理アドレスが連続していないときでも、割当領域において論理アドレスは連続する。同様にして、割当領域（Ｉ）や割当領域（Ｊ）の論理アドレスも共に「０ｘ００００」から開始される。以下、１以上のセグメントにより形成される論理アドレス空間のことを「バッファ」または「バッファ空間」とよぶことにする。バッファは、タスクごとに固有の論理アドレス空間であってもよいし、１つのタスクが複数のバッファ空間を使用してもよい。同図の場合、５つのバッファ空間、いいかえれば、５種類の論理アドレス空間が形成されている。【００１８】
論理アドレスによるアドレッシングを実現するためには、タスクにより指定される論理アドレスをメモリにおける物理的な位置を特定するための物理アドレスに変換するための機構が必要となる。このようなアドレス変換機能は、ソフトウェアＯＳのメモリ管理機能として実現されてもよい。しかし、ソフトウェアＯＳは、その動作のためにＣＰＵの演算能力を利用するため、メモリ管理関連処理の実行がアプリケーションの処理パフォーマンスに影響する。リアルタイム性を要求されるシステムにおいては、メモリ管理処理にともなうオーバーヘッドを極力抑制することが望ましい。
本実施例におけるメモリ管理装置１００は、図３に示したメモリ管理方式をハードウェアロジックとして実装することにより、効率的なだけではなく高速なメモリ管理を実現している。
［基本例］【００１９】
図４は、本実施例におけるメモリ管理装置１００の回路図を示す。
ＣＰＵ１１０には、アドレスバスADDとデータバスDTが接続されている。ＣＰＵ１１０は、アドレスバスADDを介してメモリのアドレスを指定する。ADDは３２ビットである。ADDの詳細は図５に関連して説明する。ＣＰＵ１１０は、データバスDTを介してデータを送受する。【００２０】
第１メモリ１１２は、アドレスバスADDとデータバスDTに接続される。第１メモリ１１２は、ＣＰＵ１１０によりプログラム領域およびスタック領域として使用される。第２メモリ１３０は、データバスDTに接続され、アドレスバスADDとはアドレス変換回路１２８を介して接続される。第２メモリ１３０は、ＣＰＵ１１０によりヒープ領域として使用される。図３に関連して説明したように、第２メモリ１３０は複数のセグメントに分割される。【００２１】
割当制御回路１２０は、バッファとセグメントの関連づけを行う。割当制御回路１２０はタスクにバッファを割り当て、バッファにセグメントを割り当てる。バッファの数とセグメントの数には上限がある。バッファキュー１２２は、所定個数のバッファのうち、割り当て可能な状態にあるバッファの「バッファＩＤ（以下、「BFID」と表記する。）」を保持する。セグメントキュー１２４は、所定個数のセグメントのうち、割り当て可能な状態にあるセグメントのSegIDを保持する。バッファとセグメントの対応関係は「セグメント割当情報」として状態保持回路１２６に保持される。図３に示した例の場合であれば、バッファ（Ｈ）、セグメント（ＩＤ：０）、セグメント（ＩＤ：２）、セグメント（ＩＤ：３）がセグメント割当情報として対応づけられることになる。アドレス変換回路１２８は、ＣＰＵ１１０から送出された論理アドレスADD[31:0]を物理アドレスM2AD[15:0]に変換する。
以下、基本例、および、後に示す改良例の一つである「移行改良例」では、
バッファの数：最大８個
セグメントのサイズ：２５６バイト
１バッファあたりのセグメント数：最大１６個
セグメント総数：１２８個（１６×８＝１２８）
という仕様であるとして説明する。【００２２】
メモリ管理装置１００は、少なくとも、割当制御回路１２０、バッファキュー１２２、セグメントキュー１２４、状態保持回路１２６、アドレス変換回路１２８の集合として形成される装置であるが、ＣＰＵ１１０や第２メモリ１３０、第１メモリ１１２を含む装置として形成されてもよい。割当制御回路１２０については図７、状態保持回路１２６については図８と図９、アドレス変換回路１２８については図１０に関連して詳述する。【００２３】
図５は、論理アドレスADDと物理アドレスM2ADのデータ構造を示す。
メモリ（MEM）：３２ビットの論理アドレスADD[31:0]のうち上位１２ビットのADD[31:20]がアクセス先となるメモリを指定する。ADD[31:20]=0のときには第１メモリ１１２、ADD[31:20]=1のときには第２メモリ１３０がアクセス先となる。
バッファ（BFID）：４ビットのADD[19:16]はアクセス先のバッファ空間を指定する。タスクは、後述する「バッファ取得要求」コマンドによりバッファ空間を割り当てられ、割り当てられたバッファ空間のBFIDを取得し、以降においてはこのBFIDによりアクセス先バッファ空間を指定する。バッファは最大８個であるから、BFIDは「０〜７」のいずれかである。
セグメント番号（SegOdr）：４ビットのADD[11:8]は、「セグメント番号（以下、「SegOrder」や「SegOdr」とも表記する。）」を示す。SegOdrは、各バッファ空間における論理アドレス範囲を特定するための番号である。図３の場合であれば、バッファ（Ｈ）においてＨ１（セグメント（ＩＤ：０））、Ｈ２（セグメント（ＩＤ：２））、Ｈ３（セグメント（ＩＤ：３））のSegOdrはそれぞれ「０」、「１」、「２」となる。セグメント番号により、指定されたバッファ空間における論理アドレス範囲が特定される。１バッファあたりのセグメント数は最大１６個なので、セグメント番号は「０〜１５」のいずれかである。以下、SegID=mにより示されるセグメントのことを「セグメント（番号：ｍ）」のように表記する。SegIDが第２メモリ１３０における物理アドレス上の位置を特定し、SegOdrはバッファ空間における論理アドレス上の位置を特定する。セグメント番号に関しては、図６に関連して更に説明する。
セグメント内アドレス（SegAdd）：８ビットのADD[7:0]は、「セグメント内アドレス（以下、「SegAdd」とも表記する。）」を示す。セグメントのサイズは２５６バイトなので、セグメント内アドレスは「０〜２５５」のいずれかである。【００２４】
このように、MEM、BFID、SegOdr、SegAddを含む論理アドレスADD[31:0]により、ＣＰＵ１１０は第２メモリ１３０のアクセス位置を指定する。アドレス変換回路１２８は、論理アドレスADD[31:0]と状態保持回路１２６のセグメント割当情報から、物理アドレスM2AD[15:0]を生成する。具体的な変換方法については、図１１に関連して詳述する。【００２５】
SegID：物理アドレスM2AD[15:0]のうち上位８ビットM2AD[15:8]はSegIDを示す。SegIDにより、セグメントサイズの単位で物理アドレス範囲が特定される。
セグメント内アドレス（SegAdd）：８ビットのM2AD[7:0]は、セグメント内アドレス（SegAdd）を示す。
たとえば、図３に示した例の場合、M2AD[15:0]においてSegID=1、SegAdd=0x0004であれば、セグメント（ＩＤ：１）は物理アドレス「０ｘ０１００〜０ｘ０１ＦＦ」に対応するため、０ｘ０１００＋０ｘ０００４より、物理アドレスは「０ｘ０１０４」となる。【００２６】
図６は、物理アドレスADDと物理アドレスM2ADの対応関係を示す図である。
セグメント（番号：０）は、論理アドレス「０ｘ０００〜０ｘ０ＦＦ」に対応する。同様に、セグメント（番号：１）は、論理アドレス「０ｘ１００〜０ｘ１ＦＦ」に対応する。  セグメント（番号：０）、いいかえれば、このバッファ空間の先頭に位置に対応づけられているセグメントは、セグメント（ＩＤ：２２）である。セグメント（番号：１）は、セグメント（ＩＤ：１０６）と対応づけられている。このような対応関係は、セグメント割当情報として割当制御回路１２０により状態保持回路１２６に設定される。セグメント内アドレスM2AD[7:0]により、セグメント内の位置が特定される。
論理アドレスADDは、セグメント割当情報に基づいて、物理アドレスM2ADに変換される。【００２７】
図７は、基本例に関して、割当制御回路１２０とその周辺の回路構成を示す図である。
（１）バッファキュー１２２
バッファキュー１２２は、新たに割り当て可能なバッファ空間のBFIDをＦＩＦＯ（First-In First-Out）方式にて保存するメモリである。割当制御回路１２０が割り当てることができるバッファ空間は最大８個なので、初期状態においては、バッファキュー１２２には８つのBFIDが保持される。割当制御回路１２０は、タスクに新たなバッファ空間を割り当てるときには、バッファキュー１２２からBFIDを１つ取り出す。また、割当制御回路１２０は、既に割り当てているバッファ空間を解放するときには、そのBFIDをバッファキュー１２２に戻す。【００２８】
バッファキュー１２２と割当制御回路１２０との間の信号は以下の５つである。
ａ．UAB_WR：割当制御回路１２０からバッファキュー１２２への書込信号である。
ｂ．UAB_DI：割当制御回路１２０からバッファキュー１２２へのBFID送信信号である。UAB_WRがアサート（assert）されると、UAB_DIに現れているBFIDがバッファキュー１２２に書き込まれる。バッファ空間を解放するとき、割当制御回路１２０はUAB_WRをアサートして、BFIDをバッファキュー１２２に１つ戻す。
ｃ．UAB_RD_ABL：バッファキュー１２２にBFIDが保持されているか否か、いいかえれば、割り当て可能なバッファ空間が残っているか否かを示す。BFIDが保持されているときの値は「１」、保持されていないときの値は「０」となる。新たなバッファ空間を取得するときに、割当制御回路１２０はUAB_RD_ABLをチェックして、取得可能か否かを判定する。
ｄ．UAB_RE：割当制御回路１２０からバッファキュー１２２への読出信号である。
ｅ．UAB_DO：バッファキュー１２２から割当制御回路１２０へのBFID送信信号である。UAB_REがアサートされると、UAB_DOに現れているBFIDがバッファキュー１２２から割当制御回路１２０に読み出される。バッファ空間を新たに割り当てるとき、割当制御回路１２０はUAB_RD_ABL=1であることを確認して、UAB_RDをアサートする。これにより、バッファキュー１２２からBFIDが１つ取り出される。【００２９】
（２）セグメントキュー１２４
セグメントキュー１２４は、新たに割り当て可能なセグメントのSegIDをＦＩＦＯ方式にて保存するメモリである。割当制御回路１２０が割り当てることができるセグメントは最大１２８個なので、初期状態においては、セグメントキュー１２４には１２８個のSegIDが保持される。割当制御回路１２０は、新たなセグメントをバッファ空間に割り当てるときには、セグメントキュー１２４からSegIDを取り出す。また、割当制御回路１２０は、既に割り当てているセグメントを解放するときには、そのSegIDをセグメントキュー１２４に戻す。【００３０】
セグメントキュー１２４と割当制御回路１２０との間の信号は以下の５つである。
ａ．UAS_WR：割当制御回路１２０からセグメントキュー１２４への書込信号である。
ｂ．UAS_DI：割当制御回路１２０からセグメントキュー１２４へのSegID送信信号である。UAS_WRがアサートされると、UAS_DIに現れているSegIDがセグメントキュー１２４に書き込まれる。バッファ空間の解放などにともなってセグメントを解放するとき、割当制御回路１２０はUAS_WRをアサートする。
ｃ．UAS_RD_ABL：セグメントキュー１２４にSegIDが保持されているか否か、いいかえれば、割り当て可能なセグメントが残っているか否かを示す。SegIDが保持されているときの値は「１」、保持されていないときの値は「０」となる。新たなセグメントを取得するときに、割当制御回路１２０はUAS_RD_ABLを見て、取得可能か否かを判定する。
ｄ．UAS_RE：割当制御回路１２０からセグメントキュー１２４への読出信号である。
ｅ．UAS_DO：セグメントキュー１２４から割当制御回路１２０へのSegID送信信号である。UAS_REがアサートされると、UAS_DOに現れているSegIDがセグメントキュー１２４から割当制御回路１２０に読み出される。バッファにセグメントを割り当てるとき、割当制御回路１２０はUAS_RD_ABL=1であることを確認して、UAS_RDをアサートする。【００３１】
（３）ＣＰＵインタフェース１３２
ＣＰＵインタフェース１３２は、ＣＰＵ１１０のアドレスバスADD、データバスDTと接続され、ＣＰＵ１１０から割当制御回路１２０へのコマンド送信を仲介するデコーダ回路である。また、ＣＰＵインタフェース１３２は、割当制御回路１２０からＣＰＵ１１０へのデータ送信も仲介する。ＣＰＵ１１０から割当制御回路１２０に対しては、後述する複数種類のコマンドがDTを介して送信される。また、コマンドのパラメータ（以下、「設定パラメータ」とよぶ）もデータバスDTを介して割当制御回路１２０に送信される。ＣＰＵインタフェース１３２は、このコマンドや設定パラメータを保持するためのレジスタを備える。一方、割当制御回路１２０からは、コマンドの成功・失敗を示す「結果データ」や、実行結果を示すパラメータ（以下、「結果パラメータ」とよぶ）がＣＰＵ１１０に送信される。ＣＰＵインタフェース１３２は、この結果データや結果パラメータを保持するためのレジスタも備える。【００３２】
ａ．REQ_C：ＣＰＵインタフェース１３２がコマンドと設定パラメータを保持しているときにアサートされる信号である。
ｂ．REQ_D：ＣＰＵ１１０から送信されたコマンドと設定パラメータを示す。割当制御回路１２０は、REQ_Cがアサートされているとき、REQ_Dからコマンドと設定パラメータを読み出す。
ｃ．RES_C：割当制御回路１２０により、コマンドの実行完了時にアサートされる信号である。
ｄ．RES_D：割当制御回路１２０から送信された結果データと結果パラメータを示す。ＣＰＵインタフェース１３２は、RES_Cがアサートされているとき、RES_Dに現れている結果データと結果パラメータをレジスタに記録する。
ｅ．INTR：コマンドの実行完了時に送信される割込信号である。ＣＰＵインタフェース１３２は、結果データをレジスタに記録したあと、INTRをアサートしてＣＰＵ１１０に割込通知する。ＣＰＵ１１０は、INTRにより割込通知されると、データバスDTを介してＣＰＵインタフェース１３２のレジスタから結果データや結果パラメータを読み出す。
このようにして、ＣＰＵインタフェース１３２は割当制御回路１２０とＣＰＵ１１０の間でコマンドの送信とその結果の返信を中継する。【００３３】
（４）テーブル保持部１３４
テーブル保持部１３４は、状態保持回路１２６のセグメント割当情報の全部または一部を一時的に保持するレジスタである。割当制御回路１２０は、状態保持回路１２６からセグメント割当情報を取得し、テーブル保持部１３４に記録して、設定内容を変更した後、状態保持回路１２６に送出することにより、状態保持回路１２６のセグメント割当情報を更新する。テーブル保持部１３４は、割当制御回路１２０が状態保持回路１２６に対してセグメント割当情報を設定するための作業領域であるといえる。以下、セグメント割当情報のうち、テーブル保持部１３４に保持されているデータのことを、特に「セグメントテーブル」ともよぶ。【００３４】
テーブル保持部１３４に関わる信号は以下の４つである。
ａ．WR_BT：割当制御回路１２０からテーブル保持部１３４への書込信号である。
ｂ．SEG_ORDER：セグメント番号（SegOdr）を指定する信号である。
ｃ．SEG_ID：SegIDを指定する信号である。WR_BTがアサートされると、セグメントテーブルにおいて、SEG_ORDERにて指定されるセグメントに対してSEG_IDにて指定されるSegIDが書き込まれる。
ｄ．BS_WR：セグメントテーブルを示す。セグメントテーブルの内容はBS_WRにより常時出力されている。割当制御回路１２０は、状態保持回路１２６に対する書込信号であるWRをアサートすることにより、BS_WRに現れているデータの全部または一部を状態保持回路１２６に記録する。【００３５】
割当制御回路１２０と状態保持回路１２６が直接関わる信号は以下の５つである。
ｅ．BS_RD：状態保持回路１２６のセグメント割当情報を示す信号である。状態保持回路１２６に対する読出信号であるRDをアサートすることにより、BS_RDにセグメント割当情報が現れる。
ｆ．BF_ID：BFIDを指定する信号である。
ｇ．WR：割当制御回路１２０から状態保持回路１２６に対する書込信号である。WRがアサートされると、BS_WRに現れているセグメントテーブルのうち、BFIDにて指定されるバッファ空間についてのデータが状態保持回路１２６に記録される。
ｈ．RD：割当制御回路１２０から状態保持回路１２６に対する読出信号である。RDがアサートされると、状態保持回路１２６のセグメント割当情報のうち、BFIDにて指定されるバッファ空間についてデータがBS_RDに現れる。読み出されたデータはテーブル保持部１３４のセグメントテーブルにコピーされる。
ｉ．CLR：割当制御回路１２０から状態保持回路１２６に対するクリア信号である。CLRがアサートされると、BFIDにて指定されるバッファ空間についてのセグメント割当情報をクリアすることができる。
なお、割当制御回路１２０はＣＰＵインタフェース１３２およびテーブル保持部１３４をその回路の一部として含んで形成されてもよい。【００３６】
図８は、基本例における状態保持回路１２６の回路構成図である。
状態保持回路１２６は、複数のレジスタグループ１４０を備える。各レジスタグループ１４０は、BFID、すなわち、バッファ空間と対応づけられる。レジスタグループ１４０ａは、BFID=0のバッファ空間（以下、「バッファ空間（ＩＤ：０）」と表記する）に対応する。バッファ空間は最大８個なので、レジスタグループ１４０も８個となる。BFID=nのレジスタグループ１４０のことを、「レジスタグループ１４０（ＩＤ：ｎ）」と表記することにする。【００３７】
レジスタグループ１４０は、複数のセグメントレジスタ１４６を含む。セグメントレジスタ１４６は、セグメント番号（SegOdr）と対応づけられる。１バッファ空間あたりのセグメント数は最大１６個なので、レジスタグループ１４０に含まれるセグメントレジスタの数も１６個となる。以下、SegOdr=mのセグメントレジスタ１４６のことを、「セグメントレジスタ１４６（番号：ｍ）」と表記することにする。同図において、セグメントレジスタ１４６ａはレジスタグループ１４０（ＩＤ：０）のセグメントレジスタ１４６（番号：０）であり、セグメントレジスタ１４６ｂはレジスタグループ１４０（ＩＤ：０）のセグメントレジスタ１４６（番号：１）である。
基本例におけるセグメントレジスタ１４６は、９ビットレジスタである。レジスタグループ１４０（ＩＤ：ｎ）のセグメントレジスタ１４６（番号：ｍ）に保持されているデータをBn_Sm[8:0]と表記すると、上位１ビットBn_Sm[8]はバッファ空間（ＩＤ：ｎ）のセグメント（番号：ｍ）にセグメントが割り当てられているか否かを示す。Bn_Sm[8]=1は「割当済」、Bn_Sm[8]=0は「未割当」を示す。残り８ビットBn_Sm[7:0]が割り当てられているセグメントのSegIDを示す。【００３８】
たとえば、レジスタグループ１４０（ＩＤ：２）のセグメントレジスタ１４６（番号：１）に関し、B2_S1[8]=1、B2_S1[7:0]=102であれば、セグメント（番号：１０２）が割り当てられていることを示す。【００３９】
テーブル保持部１３４から送信されたセグメント割当情報を示すBS_WRは、各レジスタグループ１４０、ひいては、各セグメントレジスタ１４６への入力となる。BS_WRのうち、BFID=nに関するデータはレジスタグループ１４０（ＩＤ：ｎ）に入力される。そのうち、SegOdr=mに関するデータはセグメントレジスタ１４６（番号：ｍ）に入力される。【００４０】
状態保持回路１２６が、BF_IDによりBFID=0を指定し、WRをアサートすると、デコーダ１４２は、BF_0_WRをアサートする。このとき、BS_WRにあらわれているセグメント割当情報のうち、BFID=0に対応するデータがレジスタグループ１４０（ＩＤ：０）に書き込まれる。他のBFID値が指定されたときも同様である。
状態保持回路１２６が、BF_IDによりBFID=0を指定し、CLRをアサートすると、デコーダ１４２は、BF_0_CLRをアサートする。このとき、レジスタグループ１４０（ＩＤ：０）に含まれる全てのセグメントレジスタ１４６について、B0_Sm[8]=0にセットされる。こうして、バッファとセグメントの対応関係がレジスタグループ１４０において解消される。
セグメントレジスタ１４６のデータは、セレクタ１４４に出力される。割当制御回路１２０が、BF_IDによりBFID=nを指定し、RDをアサートすると、セレクタ１４４は、レジスタグループ１４０（ＩＤ：ｎ）のデータをBS_RDとして割当制御回路１２０に送出する。
また、セレクタ１４４は、論理アドレスADDによりBFIDを指定されたときには、該当するレジスタグループ１４０のデータをB_SO（B_SO0[8:0]、B_SO1[8:0]、・・・、B_SO15[8:0]の集合）としてアドレス変換回路１２８に送信する。【００４１】
図９は、状態保持回路１２６において、セグメントレジスタ１４６のデータ保持状態を示す図である。
同図においては、縦１列がちょうど１つのレジスタグループ１４０に対応している。たとえば、BFID=2、SegOdr=4の欄は、レジスタグループ１４０（ＩＤ：２）のセグメントレジスタ１４６（番号：４）に保持されているSegIDを示す。同図においてはSegID=20となっている。すなわち、バッファ空間（ＩＤ：２）のセグメント（番号：４）には、セグメント（ＩＤ：２０）が対応づけられている。同図において「−」と表記されている欄は、セグメントが割り当てられていないことを示す。たとえば、レジスタグループ１４０（ＩＤ：０）は、セグメント（番号：０）、セグメント（番号：１）、セグメント（番号：２）にはセグメントが割り当てられているが、それ以降については割り当てられていない。【００４２】
図１０は、基本例におけるアドレス変換回路１２８の回路構成図である。
アドレス変換回路１２８には、ＣＰＵ１１０により指定される論理アドレスADDと、状態保持回路１２６から送出されるB_SOが入力される。論理アドレスADD[31:0]のうち、ADD[31:16]は、状態保持回路１２６のセレクタ１４４に入力され、セレクタ１４４は、ADD[31:16]に指定されたBFIDについてのセグメント割当情報をB_SOとしてアドレス変換回路１２８に送信する。【００４３】
ＣＰＵ１１０により指定される論理アドレスADD[31:0]のうち、ADD[11:8]により指定されるSegOdrは、アドレス変換回路１２８内のセレクタ１６８に入力される。SegOdr=mであれば、セレクタ１６８は、B_SOのうち該当するセグメント（番号：ｍ）のSegIDをM2AD[15:8]として送出する。また、ADD[7:0]のセグメント内アドレス（SegAdd）は、そのままM2AD[7:0]として送出される。こうして、論理アドレスADD[31:0]は物理アドレス[15:0]に変換される。
以上の回路構成をもとにして、メモリ管理装置１００の処理過程をフローチャートにより説明する。以下、「アドレス変換」、「バッファ取得」、「バッファ全解放」、「バッファ部分解放」、「セグメント移行」という５種類の処理を順番に説明する。【００４４】
図１１は、基本例におけるアドレス変換処理の処理過程を示すフローチャートである。
ＣＰＵ１１０により実行されるタスクは、論理アドレスADD[31:0]により第２メモリ１３０のアクセス位置を指定する。アドレス変換回路１２８は、この論理アドレスADD[31:0]を取得する（Ｓ１０）。このとき、状態保持回路１２６は、論理アドレスADD[31:0]のうちADD[31:16]を取得する。状態保持回路１２６のセレクタ１４４は、ADD[31:16]のうちのADD[19:16]からBFIDを取得する（Ｓ１２）。指定されたBFID=nであったとする。状態保持回路１２６のセレクタ１４４は、指定されたBFID=nに対応するレジスタグループ１４０（ＩＤ：ｎ）を選択する（Ｓ１４）。状態保持回路１２６は、論理アドレスADD[31:0]により指定されたバッファ空間（ＩＤ：ｎ）についてのセグメント割当情報をB_SOとしてアドレス変換回路１２８に送る。【００４５】
一方、アドレス変換回路１２８は、論理アドレスADD[31:0]のうちのADD[11:8]からSegOdrを取得する（Ｓ１６）。指定されたSegOdr=mであったとする。アドレス変換回路１２８のセレクタ１６８は、指定されたSegOdrについてのSegIDをB_SOmから特定する（Ｓ１８）。取得されたSegIDとADD[7:0]のセグメント内アドレス（SegAdd）により、物理アドレスM2AD[15:0]が生成される。【００４６】
図１２は、基本例におけるバッファ取得処理の処理過程を示すフローチャートである。
ＣＰＵ１１０により実行されるタスクは、その実行結果を保存するためのバッファ空間を要求することがある。このとき、タスクは「バッファ取得要求」コマンドをＣＰＵインタフェース１３２を介して割当制御回路１２０に送信する。バッファ取得要求コマンドの設定パラメータとして、バッファに割り当てるべきセグメントの数も指定される。すなわち、設定パラメータによりバッファ空間の大きさを指定する。割当制御回路１２０は、バッファ取得要求コマンドをREQ_Dから読み出すと、以下に示すバッファ取得処理を開始する。【００４７】
割当制御回路１２０は、バッファ取得要求コマンドを取得する（Ｓ２４）。割当制御回路１２０は、バッファキュー１２２のUAB_RD_ABLをチェックして、空いているBFIDが存在するかを判定する（Ｓ２６）。空きバッファがなければ（Ｓ２６のＮ）、Ｓ４２のエラー処理に移行する。空きバッファがあれば（Ｓ２６のＹ）、割当制御回路１２０はUAB_DOによりBFIDを１つ取得する（Ｓ２８）。ここでは、取得したBFID=nとする。【００４８】
次に、割当制御回路１２０は、セグメントキュー１２４のUAS_RD_ABLをチェックして、空いているSegIDが存在するかを判定する（Ｓ３０）。空きセグメントがなければ（Ｓ３０のＮ）、Ｓ４２のエラー処理に移行する。空きセグメントがあれば（Ｓ３０のＹ）、割当制御回路１２０はUAS_DOによりSegIDを１つ取得する（Ｓ３２）。割当制御回路１２０は、テーブル保持部１３４のセグメントテーブルにおいて、SegOdr=0から順番に取得されたSegIDを登録する（Ｓ３４）。セグメントテーブルにおいて、SegIDが登録されたセグメントについては「割当済」、それ以外は「未割当」が設定される。設定パラメータとして指定された数だけSegIDを取得していないときには（Ｓ３６のＮ）、処理はＳ３０に戻る。指定数だけ取得したときには（Ｓ３６のＹ）、割当制御回路１２０は、取得したBFID=nを指定し、WRをアサートして、状態保持回路１２６のセグメントテーブルをデータをレジスタグループ１４０（ＩＤ：ｎ）に登録する（Ｓ３８）。【００４９】
こうして、バッファとセグメントの新たな対応関係がセグメント割当情報として状態保持回路１２６に登録される。割当制御回路１２０は、取得したBFID=nを結果パラメータとして「バッファ取得要求」の成功をRES_Dを介してＣＰＵ１１０に通知する（Ｓ４０）。
一方、BFIDやSegIDの取得に失敗したときには（Ｓ２６のＮ、Ｓ３０のＮ）、割当制御回路１２０は所定のエラー処理を実行した後に（Ｓ４２）、「バッファ取得要求」の失敗を通知する（Ｓ４４）。エラー処理とは、たとえば、BFIDの取得に成功したもののSegIDの取得に失敗したとき、BFIDをバッファキュー１２２に返すことにより、バッファ取得処理開始前の状態に原状回復させるための処理である。タスクは、バッファ取得要求に失敗すると、所定時間後にバッファ取得要求を再試行してもよい。【００５０】
図１３は、基本例におけるバッファ全解放処理の処理過程を示すフローチャートである。
ＣＰＵ１１０により実行されるタスクは、いったん確保したバッファ空間をもはや使用しないときにはバッファ空間を解放する。バッファ空間の解放方法としては、バッファ空間に対応づけられているセグメントの全部を解放する「全解放」と一部を開放する「部分解放」の２つがある。全解放時には、タスクは「バッファ全解放要求」コマンドをＣＰＵインタフェース１３２を介して割当制御回路１２０に送信する。バッファ全解放要求コマンドの設定パラメータとして、解放対象となるバッファ空間のBFIDが指定される。割当制御回路１２０は、バッファ全解放要求コマンドをREQ_Dから読み出すと、以下に示すバッファ全解放処理を開始する。【００５１】
割当制御回路１２０は、バッファ全解放要求コマンドを取得する（Ｓ４８）。割当制御回路１２０は、設定パラメータにて指定されたBFIDに関して、レジスタグループ１４０のデータをBS_RDから読み出す（Ｓ５０）。指定されたBFID=nとする。レジスタグループ１４０（ＩＤ：ｎ）、いいかえれば、バッファ空間（ＩＤ：ｎ）にセグメントが割り当てられていないときには（Ｓ５２のＮ）、「バッファ全解放要求」は無効であり、「失敗」を通知する（Ｓ６２）。バッファ空間にセグメントが割り当てられていないのだから、そのバッファ空間は未使用である。この場合、BFID=nをバッファキュー１２２に投入して、BFID=nを再割当可能な状態に戻す。バッファにセグメントが割り当てられているか否かは、セグメントレジスタ１４６のBn_Sm[8]をチェックするだけで判定できる。【００５２】
１つでもセグメントが割り当てられていれば（Ｓ５２のＹ）、割当制御回路１２０は、割り当てられている１以上のセグメントについてのSegIDをセグメントキュー１２４に投入する（Ｓ５４）。更に、割当制御回路１２０は、CLRをアサートすることにより、該当レジスタグループ（ＩＤ：ｎ）の全セグメントレジスタ１４６について「未割当：０」設定する（Ｓ５６）。こうして、バッファ全解放要求にて指定されたバッファ空間（ＩＤ：ｎ）に対応づけられていたセグメントは、すべて再割当可能な状態に戻される。次に、割当制御回路１２０は、指定されたBFID=nをバッファキュー１２２に投入する（Ｓ５８）。こうして、BFID=nも再割当可能な状態に戻される。割当制御回路１２０は、「バッファ全解放要求」の成功をRES_Dを介してＣＰＵ１１０に通知する（Ｓ６０）。【００５３】
図１４は、バッファ部分解放処理の内容を説明するための模式図である。
タスクの実行過程において、バッファ空間内のデータの一部が不要になることがある。このような場合には、不要データを保持しているセグメントを解放することにより、メモリの再利用を促進した方がよい。バッファ部分解放処理とは、バッファ空間に対応づけられている１以上のセグメントのうちの一部を解放するための処理である。【００５４】
同図の場合、バッファ空間（ＩＤ：ｎ）において、セグメント番号「０」〜「４」に対してセグメントが割り当てられている。この５つの割当済セグメントのうちの一部を解放、すなわち、再割当可能な状態に設定するために、タスクは「バッファ部分解放要求」コマンドをＣＰＵインタフェース１３２を介して割当制御回路１２０に送信する。設定パラメータは、解放対象となるバッファ空間のBFIDと論理アドレスにより指定される「解放アドレス」である。解放アドレスは論理アドレスである。【００５５】
まず、「解放アドレス−１」となる論理アドレスを含むセグメント番号（SegOdr）が特定される。同図の場合、このセグメント番号は「２」である。以下、「解放アドレス−１」となる論理アドレスを含むセグメント番号のことを「維持番号」とよぶ。割当制御回路１２０は、「維持番号＋１」以降のセグメント番号に対応づけられているセグメントを解放対象とする。同図の場合、セグメント番号「３」と「４」に割り当てられているセグメントが解放される。【００５６】
図１５は、基本例におけるバッファ部分解放処理の処理過程を示すフローチャートである。
割当制御回路１２０は、バッファ部分解放要求コマンドを取得する（Ｓ６６）。割当制御回路１２０は、設定パラメータにて指定されたBFIDに関して、レジスタグループ１４０のデータをBS_RDから読み出す（Ｓ６８）。指定されたBFID=nとする。次に、設定パラメータにて指定された解放アドレスから維持番号を特定する（Ｓ７０）。レジスタグループ１４０（ＩＤ：ｎ）、いいかえれば、バッファ空間（ＩＤ：ｎ）におけるセグメントのうち、「維持番号＋１」以降のセグメント番号について、セグメントが割り当てられていないときには（Ｓ７２のＮ）、「バッファ部分解放要求」は無効であり、「失敗」を通知する（Ｓ８２）。【００５７】
１つでもセグメントが割り当てられていれば（Ｓ７２のＹ）、割当制御回路１２０は、「維持番号＋１」以降のセグメント番号について、SegIDをセグメントキュー１２４に投入する（Ｓ７４）。更に、割当制御回路１２０は、「維持番号＋１」以降のセグメント番号に関し、テーブル保持部１３４のセグメントテーブルについて「未割当：０」設定する（Ｓ７６）。そして、設定後のセグメントテーブルのデータをレジスタグループ１４０（ＩＤ：ｎ）に登録することにより、レジスタグループ１４０（ＩＤ：ｎ）の内容を更新する（Ｓ７８）。こうして、バッファ空間（ＩＤ：ｎ）に対応づけられているセグメントのうち、「維持番号＋１」以降のセグメント番号に対応づけられているセグメントは、すべて再割当可能な状態に戻される。割当制御回路１２０は、「バッファ一部解放要求」の成功をRES_Dを介してＣＰＵ１１０に通知する（Ｓ８０）。【００５８】
図１６は、セグメント移行処理の内容を説明するための模式図である。
タスクの実行過程において、あるバッファ空間のデータを別のバッファ空間に移動したい場合がある。あるいは、あるバッファ空間と別のバッファ空間の間でメモリ共有（メモリマッピング）を実現したい場合もある。セグメント移行処理とは、バッファ空間に対応づけられているセグメントの割当先を別のバッファ空間に設定するための処理である。【００５９】
同図の場合、バッファ空間（ＩＤ：４）ではセグメント番号「０」〜「２」に対してセグメントが割り当てられている。割り当てられているセグメントのSegIDは、それぞれ、「１４」、「８」、「２」である。一方、バッファ空間（ＩＤ：６）ではセグメント番号「０」、「１」に対してセグメントが割り当てられている。割り当てられているセグメントのSegIDは、それぞれ、「２０１」、「１１」である。ここで、バッファ空間（ＩＤ：６）に割り当てられているセグメントをバッファ空間（ＩＤ：４）にも割り当てることにより複数のバッファ空間に対して同じセグメントを２重に割り当てるとする。すなわち、セグメント（ＩＤ：２０１）とセグメント（ＩＤ：１１）を、バッファ空間（ＩＤ：４）のセグメント（番号：３）、セグメント（番号：４）に割り当てることがこの処理の目的である。
バッファ空間（ＩＤ：６）のセグメントをバッファ空間（ＩＤ：４）にも割り当てるために、タスクは「セグメント移行要求」コマンドを、ＣＰＵインタフェース１３２を介して割当制御回路１２０に送信する。設定パラメータは、移行先のBFID=4、移行元のBFID=6である。【００６０】
セグメント移行要求を入力されると、割当制御回路１２０は、バッファ空間（ＩＤ：４）のセグメント番号「３」、「４」に対して、バッファ空間（ＩＤ：６）のセグメント番号「０」、「１」のセグメント（ＩＤ：２０１）とセグメント（ＩＤ：１１）を割り当てる。この段階で、セグメント（ＩＤ：２０１）はバッファ空間（ＩＤ：４）のセグメント（番号：３）に割り当てられる。一方、セグメント（ＩＤ：２０１）とバッファ空間（ＩＤ：６）との対応関係は解消されていない。そのため、セグメント（ＩＤ：２０１）は、バッファ空間（ＩＤ：４）とバッファ空間（ＩＤ：６）の両方に割り当てられることになる。
仮に、タスクＡが自らがアクセス可能なバッファ空間（ＩＤ：４）のセグメント（番号：３）のデータの書き換えたとする。このとき、対応するセグメント（ＩＤ：２０１）のデータが書き換えられる。これは、バッファ空間（ＩＤ：６）のセグメント（番号：０）のデータの書き換えに他ならない。タスクＡがバッファ空間（ＩＤ：４）のセグメント（番号：３）にタスクＢに渡したいデータを記録すれば、タスクＢは自らがアクセス可能なバッファ空間（ＩＤ：６）のセグメント（番号：０）からそのデータを読み出すことにより、タスクＡから渡されたデータを取得できる。本来、タスクＡの論理アドレス空間であるバッファ空間（ＩＤ：４）とタスクＢの論理アドレス空間であるバッファ空間（ＩＤ：６）は別々の論理アドレス空間であるが、セグメントの２重割り当てにより別々のバッファ空間の間で効率的にデータを共有できる。セグメント（ＩＤ：１１）についても同様である。このように、セグメント移行要求によって、複数のバッファ空間の間のいわゆる「メモリマッピング（memory mapping）」が可能となる。【００６１】
メモリマッピングではなく、セグメント移行要求により、セグメント（ＩＤ：２０１）とセグメント（ＩＤ：１１）の割当先をバッファ空間（ＩＤ：４）のみに設定してもよい。セグメント（ＩＤ：２１０）とセグメント（ＩＤ：１１）の割当先をバッファ空間（ＩＤ：６）のセグメント（番号：０）、セグメント（番号：１）から、バッファ空間（ＩＤ：４）のセグメント（番号：３）、セグメント（番号：４）に変更すれば、バッファ空間（ＩＤ：６）のデータがバッファ空間（ＩＤ：４）に移動されることになる。具体的には、割当制御回路１２０は、まず、テーブル保持部１３４にバッファ空間（ＩＤ：４）のデータを読み出す。次に、バッファ空間（ＩＤ：６）のデータを状態保持回路１２６から取得し、テーブル保持部１３４に読み出したデータを追記する。そのあと、BFID=4を指定して、テーブル保持部１３４のデータを一気に状態保持回路１２６に書き込む。【００６２】
図１７は、基本例におけるセグメント移行処理の処理過程を示すフローチャートである。ここでは、メモリマッピングではなく、移行元のバッファ空間のセグメントの割当先を移行元のバッファ空間に「変更」し、移行元のバッファ空間を全解放する処理として説明する。移行先バッファ空間のBFID=n1、移行元バッファ空間のBFID=n2とする。
割当制御回路１２０は、セグメント移行要求コマンドを取得する（Ｓ８６）。割当制御回路１２０は移行先BFID=n1に関して、レジスタグループ１４０（ＩＤ：ｎ１）のデータをBS_RDから読み出し（Ｓ８８）、テーブル保持部１３４のセグメントテーブルにコピーする（Ｓ９０）。次に、移行元BFID=n2に関して、レジスタグループ１４０（ＩＤ：ｎ２）のデータをBS_RDから読み出す（Ｓ９２）。移行元バッファ空間（ＩＤ：ｎ２）において、１つもセグメントが割り当てられていなければ（Ｓ９４のＮ）、そもそも移行すべきセグメントがないので「セグメント移行要求」は無効であり、「失敗」を通知する（Ｓ１１０）。【００６３】
移行元バッファ空間（ＩＤ：ｎ２）において、割当済セグメントが存在しても（Ｓ９４のＹ）、移行先バッファ空間（ＩＤ：ｎ１）に十分な空きがなければ（Ｓ９６のＹ）、セグメント移行要求は無効となる。たとえば、移行先バッファ空間（ＩＤ：ｎ１）において、セグメント番号「１４」までセグメントが割り当てられているときに、２つ以上のセグメントを移行させようとするときにはオーバーフローとなり、セグメント移行要求は失敗する。【００６４】
移行先バッファ空間（ＩＤ：ｎ１）にセグメントを割り当てるのに十分な空きがあれば（Ｓ９６のＮ）、テーブル保持部１３４に保持されているセグメントテーブルのうち、移行先BFID=n1のセグメント割当情報について、移行元バッファ空間（ＩＤ：ｎ２）において割り当てられていたセグメントのSegIDを追加し、「割当済」設定する（Ｓ９８）。一方、移行元バッファ空間（ＩＤ：ｎ２）についてはCLRをアサートすることにより、全セグメントを「未割当」設定した上で（Ｓ１０２）、セグメントテーブルのうちBFID=n1のセグメント割当情報を状態保持回路１２６に登録する（Ｓ１０４）。割当制御回路１２０は、移行元BFID=n2をバッファキュー１２２に投入する（Ｓ１０６）。こうして、BFID=n2は再割当可能な状態に戻される。割当制御回路１２０は、「セグメント移行要求」の成功をＣＰＵ１１０に通知する（Ｓ１０８）。【００６５】
上記したメモリ管理機能をソフトウェアＯＳで実現する場合、メモリ管理処理を実行するためにはＣＰＵ１１０の演算機能に大きく依存しなければならない。ソフトウェアＯＳ自体による第１メモリ１１２や第２メモリ１３０へのアクセスにともなうオーバーヘッドも発生する。
これに対し、本実施例のメモリ管理装置１００は、上記したメモリ管理機能をハードウェアロジックにより実行している。第２メモリ１３０をセグメント単位で利用できるため、第２メモリ１３０の利用効率を高めることができるだけでなく、ＣＰＵ１１０の処理能力とは独立したかたちでメモリ管理を実行できる。このため、ＣＰＵ１１０で実行されるタスクの処理パフォーマンスを落とさずにメモリ管理処理を実行できる。また、汎用的なプロセッサであるＣＰＵ１１０によりメモリ管理処理を実行するよりもシンプルなプロセスによりメモリ管理を実現できるため消費電力抑制の面でも有効である。
時間的制約の厳しい環境においてバッファ空間の確保や解放が頻繁に生じるアプリケーションを実行する場合には、本実施例に示すメモリ管理装置１００は特に有効である。【００６６】
図１８は、基本例に関し、キャッシュコントロール機能を搭載した状態保持回路１２６の回路構成図である。
図８に示した状態保持回路１２６では、バッファの数だけレジスタグループ１４０を設けていた。図１８は、レジスタグループ１４０の数以上のバッファを割り当て可能な状態保持回路１２６の回路構成を示している。説明を簡単にするため、この状態保持回路１２６はレジスタグループ１４０を２つだけ含むとする。図８に示した状態保持回路１２６との違いは、デコーダ１４２の機能を備えるＣＡＳＨ制御回路１７２と、退避メモリ１７４が搭載されていることである。退避メモリ１７４は、Dual Port RAM（Random Access Memory）であってもよい。また、各レジスタグループ１４０には、複数のセグメントレジスタ１４６に加えて「バッファＩＤレジスタ１７０」が追加されている。【００６７】
割り当てることのできるバッファの数は最大８個であるが、ここでは８個のBFIDのすべてが取得済みであるとして説明する。８つのバッファのセグメント割当情報は、すべて退避メモリ１７４に保持されている。そのうち、２つのバッファのセグメント割当情報は、レジスタグループ１４０にも保持される。バッファＩＤレジスタ１７０は、対応するBFIDを保持する。【００６８】
割当制御回路１２０がセグメント割当情報を登録するためにWRをアサートすると、ＣＡＳＨ制御回路１７２は退避メモリ１７４において該当する領域のデータを更新する。該当バッファ空間のデータがレジスタグループ１４０に存在すれば更新内容を反映させる。存在しなければ、該当バッファ空間の更新後のデータをいずれかのレジスタグループ１４０にロードしてもよい。【００６９】
割当制御回路１２０がセグメント割当情報をクリアするためにCLRをアサートすると、ＣＡＳＨ制御回路１７２は退避メモリ１７４において該当する領域のデータについて全てのセグメントを「未割当」設定する。該当バッファ空間のデータがレジスタグループ１４０に存在すればレジスタグループ１４０のすべてのセグメントレジスタ１４６に「未割当」設定する。
割当制御回路１２０がセグメント割当情報を読み出すためにRDをアサートすると、ＣＡＳＨ制御回路１７２は、退避メモリ１７４において該当する領域のデータをBS_RDにより出力する。【００７０】
ＣＰＵ１１０から論理アドレスADD[31:0]が指定されると、ＣＡＳＨ制御回路１７２は該当バッファ空間についてのデータがレジスタグループ１４０に存在するかをバッファＩＤレジスタ１７０をチェックして判定する。存在すれば、CASH_SEL信号により該当レジスタグループ１４０のセグメント割当情報をB_SOとして出力させる。該当バッファ空間についてのセグメント割当情報がレジスタグループ１４０に存在しないときには、該当バッファ空間についてのセグメント割当情報を退避メモリ１７４からいずれかのレジスタグループ１４０にロードしてからB_SOとして出力させる。
このような処理方法によれば、図８の状態保持回路１２６に比べて、状態保持回路１２６全体としての回路サイズをコンパクトにできる。
次に、基本例に対する改良例として、セグメント移行処理を改良した「移行改良例」について説明する。
［移行改良例］【００７１】
図１９は、セグメント移行処理における課題について説明するための模式図である。
図１６や図１７に関連して説明したように、メモリ管理装置１００は、移行元バッファ空間のセグメントの割当先を移行先バッファ空間に変更することができる。たとえば、ＴＣＰ／ＩＰ（Transmission Control Protocol/Internet Protocol）に基づく通信系アプリケーションソフトウェアの場合、
コンテンツである送信データを生成するコンテンツ処理
送信データに付与すべきＴＣＰ／ＩＰヘッダを生成するＴＣＰ／ＩＰ処理
送信データに付与すべきＭＡＣ（Media Access Control）ヘッダを生成するＭＡＣ処理
という３つの処理を定義できる。これらの処理は必ずしも別々のプロセスや別々のスレッドである必要はないが、ここでは特に限定しない。
メモリ管理装置１００は、コンテンツ処理、ＴＣＰ／ＩＰ処理およびＭＡＣ処理のためにそれぞれバッファ空間を設定する。同図では、コンテンツ処理のバッファ空間（ＩＤ：４）には１０個、ＴＣＰ／ＩＰ処理のバッファ空間（ＩＤ：３）には２個、ＭＡＣ処理のバッファ空間（ＩＤ：０）には３個のセグメントが割り当てられている。【００７２】
バッファ空間（ＩＤ：４）の１０個のセグメントのうち、セグメント（番号：９）だけ一部しかデータが書き込まれていない。バッファ空間（ＩＤ：３）のセグメント（番号：１）、バッファ空間（ＩＤ：０）のセグメント（番号：２）についても同様である。次に、バッファ空間（ＩＤ：０）に、バッファ空間（ＩＤ：３）のセグメントとバッファ空間（ＩＤ：４）のセグメントを移行させる。こうして、バッファ空間（ＩＤ：０）には計１５個のセグメントが含まれることになる。移行後のバッファ空間（ＩＤ：０）に含まれるデータから送信フレームが形成される。【００７３】
しかし、元々のバッファ空間（ＩＤ：０）におけるセグメント（番号：２）や、バッファ空間（ＩＤ：３）におけるセグメント（番号：３）のセグメントにおいては、一部しかデータが記録されていなかったため、移行後のバッファ空間（ＩＤ：０）のデータが一部不連続となっている。同図の場合、移行後のバッファ空間（ＩＤ：０）において、セグメント（番号：２）、セグメント（番号：４）のセグメントについてデータの連続性が損なわれている。
以下においては、このような場合でも、ＣＰＵ１１０から連続的な論理アドレスによりバッファ空間のデータをアドレッシングするための方法を開示する。このような改良例のことを「移行改良例」とよぶことにする。【００７４】
図２０は、移行改良例に関して、セグメント移行処理後も論理アドレスを連続させる方法を説明するための模式図である。
基本例のセグメントレジスタ１４６は９ビットのレジスタであり、上位１ビットがセグメントの割当状態を示し、下位８ビットが割り当てられたセグメントのSegIDを示していた。移行改良例においては、セグメントレジスタ１４６は、２１ビットサイズに拡張変更される。レジスタグループ１４０（ＩＤ：ｎ）のセグメントレジスタ１４６（番号：ｍ）に保持されているデータBn_Sm[20:0]のうち、上位１ビットのBn_Sm[20]はセグメントの割り当て状態を示す。Bn_Sm[19:8]は「末尾アドレス」を示し、Bn_Sm[7:0]が割り当てられているセグメントのSegIDを示す。ここで、「末尾アドレス」とは、「バッファ空間の先頭から、当該セグメントに保持されているデータの最後尾までのバイト数」を示す。セグメントレジスタ１４６のBn_Sm[20:0]のうちBn_Sm[19:8]は、S_m_NXST[11:0]として状態保持回路１２６のセレクタ１４４から出力される。【００７５】
たとえば、図２０に示すバッファ空間の場合、セグメント（番号：０）とセグメント（番号：１）には、１２８バイト分のデータが保持されているが、セグメント（番号：２）には、７０バイト分しかデータが保持されていない。また、セグメント（番号：３）には、１２８バイト分のデータが保持されているが、セグメント（番号：４）には、９０バイト分しかデータが保持されていない。また、セグメント（番号：５）には、全くデータが保持されていない。【００７６】
同図の場合、セグメント（番号：０）の末尾アドレスS_O_NXST[11:0]は「１２８」となる。バッファ空間の先頭（論理アドレス＝０ｘ００００）から、セグメント（番号：０）におけるデータの最後尾（論理アドレス＝０ｘ００ＦＦ）までのバイト数は１２８バイトだからである。同様にして、セグメント（番号：１）の末尾アドレスS_1_NXST[11:0]は「２５６」となる。１２８＋１２８＝２５６だからである。セグメント（番号：２）の末尾アドレスS_2_NXST[11:0]は２５６＋７０＝３２６により「３２６」となる。同様にして、３２６＋１２８＝４５４よりセグメント（番号：３）の末尾アドレスS_3_NXST[11:0]は「４５４」、４５４＋９０＝５４４よりセグメント（番号：４）の末尾アドレスS_4_NXST[11:0]は「５４４」となる。【００７７】
基本例として図１１等に関連して説明したアドレス変換方法では、ADD[11:8]によりセグメント番号(SegOdr)を特定し、セグメント番号（SegOdr）によりSegIDを特定し、ADD[7:0]によりセグメント内アドレス（SegAdd）を特定することにより物理アドレスを特定する。しかし、図２０に示すバッファ空間の場合、セグメント（番号：２）の一部が未使用となっているため、論理アドレスの連続性が損なわれてしまう。いいかえれば、ＣＰＵ１１０はセグメント（番号：２）の先頭から７０バイト以降をアドレッシングしてしまうと不正アクセスとなってしまう。このような不正アクセスを防ぐためには、セグメント（番号：２）の一部にある「穴」をアドレッシングされないように処置する必要がある。【００７８】
そこで、移行改良例では、セグメント（番号：２）における最後尾データの論理アドレスと、セグメント（番号：３）における先頭データの論理アドレスを連続させることにより、セグメントの「穴」に対するアドレッシングができないように、末尾アドレスに基づいて、論理アドレスを調整している。同図の場合、セグメント（番号：０）の論理アドレスは「０番地から１２７番地」、セグメント（番号：１）の論理アドレスは「１２８番地から２５５番地」、セグメント（番号：２）の論理アドレスは「２５６番地から３２５番地」、セグメント（番号：３）の論理アドレスは「３２６番地から４５３番地」、セグメント（番号：４）の論理アドレスは「４５４番地から５４３番地」となるように論理アドレスの範囲を調整する。
以下においては、特に断らない限り、１０進数表記により論理アドレスを表現する。【００７９】
たとえば、論理アドレスADD[11:0]として当該バッファ空間の４００番地がアクセス先として指定されたとする。S_2_NXST[11:0]＝３２６、S_3_NXST[11:0]＝４５４であるから、４００番地は、セグメント（番号：３）に存在する。S_2_NXST[11:0]＝３２６なので、４００−３２６＝７４より、４００番地はセグメント（番号：３）において先頭から７４バイト目の位置を示すことになる。【００８０】
図２１は、移行改良例に関して、割当制御回路１２０とその周辺の回路構成を示す図である。
図７のメモリ管理装置１００と異なるのは、新たに位置検出回路１７６を追加している点にある。また、割当制御回路１２０から末尾アドレスを指定するためのNEXT_ADが追加されている。位置検出回路１７６は、SEARCH_ADDにより指定された論理アドレスを含むセグメント番号を検出する回路である。SEG_POSは、該当するセグメント番号を示す。FIN_NXは、SEARCH_ADDにより指定された論理アドレスを含むセグメント番号についての末尾アドレスを示す。位置検出回路１７６の詳細については図２３に関連して後述する。【００８１】
図２２は、移行改良例におけるアドレス変換回路１２８の回路構成図である。
アドレス変換回路１２８には、ＣＰＵ１１０により指定される論理アドレスADDと、状態保持回路１２６から送出されるB_SOが入力される。論理アドレスADD[31:0]のうち、ADD[31:16]は、状態保持回路１２６のセレクタ１４４に入力され、セレクタ１４４は、ADD[31:16]に指定されたバッファ空間に関するセグメント割当情報をB_SOとしてアドレス変換回路１２８に入力する。【００８２】
ＣＰＵ１１０により指定される論理アドレスADD[31:0]のうち、ADD[11:0]（SegOdr/SegAdd）は、アドレス変換回路１２８内の全ての減算回路１８０に入力される。各減算回路１８０は、SegIDに対応している。たとえば、減算回路１８０ａはSegID=0に対応し、減算回路１８０ｂはSegID=1に対応する。セグメントレジスタ１４６のデータサイズは２１ビットであるから、状態保持回路１２６から入力されるB_S0mも２１ビットのデータである（SegID=mとする）。セグメント（番号：０）のセグメントの割当状態を示すB_SO0[20]は、S_0_EN信号として、セグメント（番号：０）と対応する減算回路１８０ａに入力される。また、セグメント（番号：０）の末尾アドレスを示すB_SO0[19:8]も、S_0_NXST[11:0]として、減算回路１８０ａに入力される。他のセグメント番号についても同様である。セグメント（番号：０）についてのSegIDを示すB_SO0[7:0]は、S_0_ID[7:0]として、アドレス生成回路１７８に入力される。他のセグメント番号についても同様である。【００８３】
（１）減算回路１８０
減算回路１８０と比較回路１８２は、ADD[11:0]にて指定された論理アドレスを含むセグメント番号を探るための回路である。動作ロジックは以下の通りである。
S_m_EN=1（セグメント割当済）のとき：
ADD[11:0]-S_m_NXST[11:0]を計算する。ここで、ｍはセグメント番号を示す。結果が０以上の値であれば、演算結果をS_m+1_OFST[7:0]として出力する。また、S_m+1_OFST[8]=0に設定する。一方、演算結果が負値であれば、S_m+1_OFST[8]=1を出力する。
S_m_EN=0（セグメント未割当）のとき：
S_m+1_OFST[8:0]=0に設定する。なお、S_0_OFST[8:0]は常に0である。【００８４】
図２０に示した設例の場合、ADD[11:0]=400（番地）だったので、
m=0（セグメント（番号：０））：
S_0_EN=1（割当済）、ADD[11:0]-S_0_NXST[11:0]=400-128=272より、S_1_OFST[7:0]=272となる。また、S_1_OFST[8]=0となる。
m=1（セグメント（番号：１））：
S_1_EN=1（割当済）、ADD[11:0]-S_1_NXST[11:0]=400-256=144より、S_2_OFST[7:0]=144となる。また、S_2_OFST[8]=0となる。
m=2（セグメント（番号：２））：
S_2_EN=1（割当済）、ADD[11:0]-S_2_NXST[11:0]=400-326=74より、S_3_OFST[7:0]=74となる。また、S_3_OFST[8]=0となる。
m=3（セグメント（番号：３））：
S_3_EN=1（割当済）、ADD[11:0]-S_3_NXST[11:0]=400-454<0より、S_4_OFST[8]=1となる。
m=4（セグメント（番号：４））：
S_4_EN=1（割当済）、ADD[11:0]-S_4_NXST[11:0]=400-544<0より、S_5_OFST[8]=1となる。
m=5（セグメント（番号：５））：
S_3_EN=0（未割当）より、S_5_OFST[8:0]=0となる。【００８５】
（２）比較回路１８２
比較回路１８２は、S_m_OFST[8:0]とS_m+1_OFST[8:0]を比較して、比較結果をEND_S_kとして出力する。動作ロジックは以下の通りである。
S_m OFST[8]=0、かつ、S_m+1 OFST[8]=1のとき：END_S_m=1
それ以外のとき：END_S_m=0
となる。【００８６】
図２０に示した設例の場合、
m=0（セグメント（番号：０））：
S_0_OFST[8]=0、S_1_OFST[8]=0より、END_S_0=0となる。
m=1（セグメント（番号：１））：
S_1_OFST[8]=0、S_2_OFST[8]=0より、END_S_1=0となる。
m=2（セグメント（番号：２））：
S_2_OFST[8]=0、S_3_OFST[8]=0より、END_S_2=0となる。
m=3（セグメント（番号：３））：
S_3_OFST[8]=0、S_4_OFST[8]=1より、END_S_3=1となる。
m=4（セグメント（番号：４））：
S_4_OFST[8]＝１、S_5_OFST[8]=1より、END_S_4=0となる。
このEND_S_m=1となるときのｍが、ADD[11:0]に示された論理アドレスを含むセグメントのセグメント番号を示す。ここでは、セグメント（番号：３）に論理アドレス「４００番地」が含まれると特定される。【００８７】
（３）アドレス生成回路１７８
アドレス生成回路１７８は、ADD[11:0]とEND_S_m、S_m_ID[7:0]、S_m_OFST[7:0]から、物理アドレスM2AD[15:0]を生成する。
m=0（セグメント（番号：０））について、END_S_0=1のときには、M2AD[15:0]のうち、M2AD[15:8]=S_0_ID[7:0]、M2AD[7:0]=ADD[7:0]となる。
m=0（セグメント（番号：０））以外のmについて、END_S_m＝１のときには、M2AD[15:0]のうち、M2AD[15:8]=S_m_ID[7:0]、M2AD[7:0]＝S_m_OFST[7:0]となる。
図２０に示した設例の場合、END_S_3=1なので、M2AD[15:8]=S_3_ID[7:0]、M2AD[7:0]=S_3_OFST[7:0]=74となる。こうして、セグメント（番号：３）に対応づけられているセグメントのの先頭から７４バイト目として物理アドレスが特定される。【００８８】
図２３は、移行改良例における位置検出回路１７６の回路構成図である。
位置検出回路１７６は、バッファ部分解放要求コマンドが入力されたときに、設定パラメータにより指定された「解放アドレス−１」をSEARCH_ADDとして入力される。基本的な仕組みは図２２に示したアドレス変換回路１２８と同様である。検出回路１８８は、SEARCH_ADDに示された「解放アドレス−１」が属するセグメント番号、すなわち、維持番号をSEG_POSとして出力する。また、検出回路１８８は、セグメント（番号：維持番号）についての末尾アドレスをFIN_NXとして出力する。【００８９】
減算回路１８４は、図２２の減算回路１８０と同様のロジックにて、ADD[11:0]とS_m_NXST[11:0]の減算処理を行う。比較回路１８６は、図２２の比較回路１８２と同様のロジックにて、「解放アドレス−１」を含むセグメント番号、すなわち、維持番号を検出する。移行改良例のメモリ管理装置１００の場合、バッファ部分解放処理のうち、図１５のＳ７０は、位置検出回路１７６に「解放アドレス−１」をSEARCH_ADDとして入力して、SEG_POSにより検出することになる。【００９０】
図２４は、移行改良例におけるアドレス変換処理の処理過程を示すフローチャートである。
同図において図１１と同一の符号を付した処理の内容は、図１１に関連して説明した内容と同等である。状態保持回路１２６が論理アドレスADDに基づいてレジスタグループ１４０を選択したあと、アドレス変換回路１２８は、図２２に関連して説明した処理方法により、論理アドレスが属するセグメント番号を特定し（Ｓ１１４）、当該セグメントにおけるオフセットS_m_OFST[7:0]を計算することにより（Ｓ１１６）、物理アドレスM2AD[15:0]を生成する（Ｓ１１８）。【００９１】
バッファ取得処理の処理過程についても、図１２に関連して説明した処理過程と同様である。ただし、セグメントレジスタ１４６に末尾アドレスを登録する点が異なる。バッファ全解放処理の処理過程については、図１３に関連して説明した処理過程と同様である。バッファ部分解放処理の処理過程については、図１５に関連して説明した処理過程と同様である。ただし、維持番号を位置検出回路１７６により求めている点が異なる。【００９２】
図２５は、移行改良例におけるセグメント移行処理の内容を説明するための模式図である。
セグメント移行処理の処理過程についても、図１７に関連して説明した処理過程と同様である。ただし、セグメントの末尾アドレスを変更するための処理が追加される。同図は、移行先バッファ空間（ＩＤ：７）と移行元バッファ空間（ＩＤ：２）の２つのバッファ空間を示している。移行先バッファ空間（ＩＤ：７）では、セグメント番号「０」、「１」に対してセグメントが割り当てられている。一方、移行元バッファ空間（ＩＤ：２）でも、セグメント番号「０」、「１」に対してセグメントが割り当てられている。ここで、バッファ空間（ＩＤ：２）のセグメントの割当先をバッファ空間（ＩＤ：７）に変更するとする。【００９３】
セグメント移行要求を入力されると、割当制御回路１２０は移行元バッファ空間（ＩＤ：２）のセグメント（番号：０）とセグメント（番号：１）に対応づけられているセグメントの割当先を、バッファ空間（ＩＤ：２）のセグメント（番号：２）とセグメント（番号：３）に変更する。【００９４】
ここで、バッファ空間（ＩＤ：ｎ）におけるセグメント（番号：ｍ）の末尾アドレスを「Nn_m」と表記することにする。セグメントの割当先を変更することにより、新たに、N7_2とN7_3を設定する必要がある。そのために、まず、割当制御回路１２０は、バッファ空間（ＩＤ：７）のセグメント（番号：２）の末尾の論理アドレスを「ONTA」として保持する。したがって、セグメント（番号：３）の先頭の論理アドレスは「ONTA+1」となる。割当制御回路１２０は、N7_2=N2_0+ONTA、N7_3=N2_1+ONTAとして末尾アドレスを設定する。このような設定方法により、セグメント移行処理後も、移行先セグメントの末尾アドレスを正しく設定することができる。
すなわち、移行改良例において、セグメントレジスタ１４６は、該当セグメントにおける末尾アドレスを保持し、アドレス変換回路１２８は、この末尾アドレスに基づいて、セグメント移行後のバッファ空間における論理アドレスを「データ存在領域」だけに付与している。このため、セグメント移行処理された後のバッファ空間に対する「データ存在領域」以外へのアクセスを防止しやすくなる。
次に、別の改良例として、バッファ連結機能を追加した「連結改良例」について説明する。
［連結改良例］【００９５】
上記した基本例や移行改良例では、バッファ空間に含まれるセグメント数は最大８個として説明した。そのため、１つのバッファ空間のサイズは、８セグメント、すなわち、２５６×８＝２０４８バイト（２キロバイト）に制限されることになる。
しかし、タスクによって必要なバッファ空間のサイズはさまざまである。たとえば、ある処理Ａは２キロバイトのバッファ空間があれば充分であるが、別の処理Ｂは１００キロバイトのバッファ空間が必要かもしれない。あるいは、処理Ａは通常は２キロバイトのバッファ空間で十分であるが、ごくまれに１００キロバイトのバッファ空間が必要になるかもしれない。
２キロバイトのバッファ空間はセグメント８個で実現できるが、１００キロバイトのバッファ空間を実現するにはセグメントが４００個必要である。１００キロバイトが要求される場合に備えてバッファ空間の最大サイズを１００キロバイトとして設定してもよいが、１つのレジスタグループ１４０あたり４００個のセグメントレジスタ１４６を含むことになる。しかし、処理Ａが４００個のセグメントレジスタ１４６をフル活用することは滅多にないため、結果としてメモリ管理装置１００の動作が非効率になってしまう。
以下においては、メモリ管理装置１００に複数のバッファ空間を連結することにより論理アドレス範囲を拡大する機能を追加することによりこのような課題を解決する方法を開示する。このような改良例のことを「連結改良例」とよぶことにする。【００９６】
図２６は、ＴＣＰ／ＩＰによるデータ送信に関して、バッファ連結処理を説明するために模式図である。
通信系アプリケーションの場合、イーサネット（Ethernet（登録商標））・プロトコルであれば、その最大フレーム長は１５２２バイトである。しかし、イーサネットの上位プロトコルであるＴＣＰ／ＩＰが扱うデータサイズには基本的に上限がない。そこで、連結改良例では、複数のバッファ空間を連結することによりＴＣＰ／ＩＰのデータを取り扱うのに十分なバッファ空間を生成する方法について開示する。以下、複数のバッファ空間を連結することにより形成される拡大された論理アドレス空間のことを「連結空間」とよぶ。【００９７】
ここでも、
コンテンツとしての送信データを生成するコンテンツ処理
送信データに付与すべきＴＣＰ／ＩＰヘッダを生成するＴＣＰ／ＩＰ処理
送信データに付与すべきＭＡＣ（Media Access Control）ヘッダを生成するＭＡＣ処理
という３つの処理を定義する。これら３つの処理は非同期的に実行されるとする。
バッファ１９０ａ、１９０ｂ、１９０ｃにより形成される連結空間１９２には、送信データ１、２、３が保持されている。まず、コンテンツ処理は、バッファ１９０ａを取得した上で送信データ１を記録する。コンテンツ処理は、次の送信データ２を記録するときには、新たにバッファ１９０ｂを取得してバッファ１９０ｂに連結する。送信データ２はバッファ１９０ａとバッファ１９０ｂにまたがって記録される。次の送信データ３はバッファ１９０ｂに記録される。更に別の送信データが保持される場合には、バッファ１９０ｃが連結されることになる。この連結空間においてはバッファ空間の境目に関係なく論理アドレスによる連続アドレッシングが可能である。このようにして、コンテンツ処理の利用する論理アドレス範囲が必要に応じて拡大される。【００９８】
ＴＣＰ／ＩＰ処理は、バッファ１９０ｄを取得し、ＴＣＰ／ＩＰヘッダであるヘッダＡを生成してバッファ１９０ｄに記録する。そして、セグメント移行要求によってバッファ１９０ａの送信データ１をバッファ１９０ｄに移行させる。バッファ１９０ｄにはヘッダＡと送信データ１が保持される。バッファ１９０ａからは送信データ１が削除される。【００９９】
ＭＡＣ処理は、バッファ１９０ｅを取得し、ＭＡＣヘッダであるヘッダＢを生成してバッファ１９０ｅに記録する。そして、セグメント移行要求によってバッファ１９０ｄのヘッダＡ＋送信データ１をバッファ１９０ｅに移行させる。バッファ１９０ｅにはヘッダＢとヘッダＡ、送信データ１が保持される。バッファ１９０ｄは全解放されてもよい。こうして、バッファ１９０ｅに保持されたヘッダＢ・ヘッダＡ・送信データ１というデータセットが送信フレームとして外部に送信されることになる。このとき、バッファ１９０ｅを全解放してもよい。
送信データ２も送信されると、バッファ１９０ａは全解放される。このような処理方法によれば、必要なときに必要なだけのバッファを取得・解放しつつ、処理に応じてバッファ空間のサイズを大きく変化させることができる。【０１００】
図２７は、ＴＣＰ／ＩＰによるデータ受信に関して、バッファ連結処理を説明するための模式図である。
外部からＴＣＰ／ＩＰパケットを受信した受信タスクは、そのパケットのＴＣＰ／ＩＰヘッダに記載されているソケット番号（ポート番号）により、宛先となるアプリケーションソフトウェアを識別する。同図においては、受信データ１〜５という５つの受信データがそれぞれバッファ１９４ａ、ｂ、ｃ、ｄ、ｅという５つのバッファに保持されている。受信タスクは、ＴＣＰ／ＩＰパケットを受信するごとにバッファを取得してもよい。バッファ取得処理を実行するためにＯＳの機能を必要としないので、ＣＰＵにほとんど負荷をかけることなく低コストにてバッファを取得できる。そのため、受信パケットごとにバッファを取得するというプログラムコードを低コストで実行できる。【０１０１】
バッファ１９４ａの受信データ１とバッファ１９４ｃの受信データ３はソケット番号：０を対象とするデータであり、バッファ１９４ｂの受信データ２、バッファ１９４ｄの受信データ４、バッファ１９４ｅの受信データ５は、ソケット番号：１を対象とするデータである。そこで、受信タスクは、ソケット番号：０用の連結空間１９６ａとソケット番号：１用の連結空間１９６ｂを用意して受信データを組み立てる。受信タスクは、受信データ１と受信データ３を連結空間１９６ａのバッファ１９４ｆに記録する。また、受信タスクは、受信データ２と受信データ４を連結空間１９６ｂのバッファ１９４ｈに記録した後、バッファ１９４ｉを連結空間１９６ｂに連結して、更に、受信データ５を記録する。
このような処理方法により、ソケットごとに必要なときに必要なだけのバッファ空間を確保できることになる。
以下、本連結改良例では、
バッファの数：最大１６個
セグメントのサイズ：１２８バイト
１バッファあたりのセグメント数：最大１６個
セグメント総数：２５６個（１６×１６＝２５６）
連結空間の数：最大１６個
として説明する。【０１０２】
図２８は、連結空間におけるLBIDとLBSNの関係を説明するための模式図である。
各連結空間は、「LBID（Linked Buffer ID）」というＩＤによって一意に識別される。また、連結空間を構成するバッファ空間には「LBSN（Linked Buffer Sequence Number）」という通し番号が付与される。１バッファあたりの最大セグメント数＝１６、１セグメントのサイズ＝１２８なので、１２８×１６＝２０４８より、１バッファあたりの最大サイズは２０４８バイト（２キロバイト）である。また、１連結空間あたりの最大バッファ数は１６なので、２０４８×１６＝３２７６８より、１連結空間あたりの最大サイズは３２７６８バイト（３２キロバイト）である。LBSNは、各連結空間における論理アドレス範囲を特定する。たとえば、LBSN=0のバッファ（以下、「バッファ（ＬＢＳＮ：０）」と表記する）は、連結空間における論理アドレス範囲「０〜３２７６７」のうちの最初の「０〜２０４７」に該当する。同様にして、バッファ（ＬＢＳＮ：１）は、連結空間における論理アドレス範囲「２０４８〜４０９５」に対応する。
既に説明したように、各バッファはセグメントの集合として形成され、セグメント番号によりバッファ空間における位置が特定される。たとえば、バッファ（ＬＢＳＮ：１）のセグメント（番号：０）は、論理アドレス範囲「２０４８〜４０９５」のうちのはじめの１２８バイトである「２０４８〜２１７５」の論理アドレス範囲が該当し、バッファ（ＬＢＳＮ：１）のセグメント（番号：１）であれば、論理アドレス範囲「２０４８〜４０９５」のうちの「２１７６〜２３０３」の論理アドレス範囲が該当する。
まとめると、
LBID：連結空間を特定する。
LBSN：連結空間における論理アドレス範囲のうちの該当範囲をバッファサイズの単位で特定する。
SegID：連結空間における論理アドレス範囲のうちの該当範囲をセグメントサイズの単位にて特定する。
SegAdd：セグメントの先頭からのオフセットを示す。【０１０３】
ところで、連結空間の数は最大１６個であり、割り当てることができるバッファの最大数も１６個である。このため、１つの連結空間に１６個のバッファを連結すると、別の連結空間を作ることはできない。一方、１つしかバッファを含まない連結空間が１６個あるときには、いずれの連結空間に対しても新たなバッファを追加することはできない。連結空間の数や連結空間に含まれるバッファの数の組み合わせはアプリケーション側にて柔軟に設定できる。そこで、連結空間には、MAX_LSBNという値を設定することにする。MAX_LBSNとは、「連結空間に接続することができるバッファの数の上限値」である。MAX_LBSNは、１〜１６の範囲で設定される。たとえば、MAX_LSBN=3として設定された連結空間では、LSBNは０〜２のいずれかである。バッファ（ＬＢＳＮ：０）、バッファ（ＬＢＳＮ：１）、バッファ（ＬＢＳＮ：２）の順にデータが記録されていく。そして、バッファ（ＬＢＳＮ：２）にもはや十分なスペースがなくなると、バッファ（ＬＢＳＮ：２）の続きとしてバッファ（ＬＢＳＮ：０）にデータが記録される。バッファ（ＬＢＳＮ：０）が使用中であれば、バッファ（ＬＢＳＮ：０）が全解放されるまで待たされることになる。このように、連結空間は循環式にデータを記録することができる。【０１０４】
図２９は、連結改良例における論理アドレスADDと物理アドレスM2ADのデータ構造を示す図である。
メモリ（MEM）：３２ビットの論理アドレスADD[31:0]のうち上位６ビットADD[31:26]はアクセス先となるメモリを指定する。ADD[31:26]=0のときには第１メモリ１１２、ADD[31:26]=1のときには第２メモリ１３０がアクセス先となる。
LBID：７ビットのADD[25:19]はLBIDを示す。連結空間の数は最大１６個のため、LBIDは０〜１５のいずれかである。LBIDにより、アクセス先となる連結空間が特定される。
LBSN：８ビットのADD[18:11]はLBSNを示す。LBIDは0からMAX_LBSN-1の範囲の整数である。LBSNにより、アクセス先の論理アドレス範囲をバッファサイズ単位にて指定できる。
セグメント番号（SegOdr）：４ビットのADD[10:7]は、セグメント番号を示す。セグメント番号により、LBSNにより指定されたバッファ空間における論理アドレス範囲をセグメントサイズ単位にて指定できる。１バッファあたりのセグメント数は最大１６個なので、セグメント番号は０〜１５のいずれかである。
セグメント内アドレス（SegAdd）：７ビットのADD[6:0]は、セグメント内アドレスを示す。セグメントのサイズは１２８バイトなので、セグメント内アドレスは「０〜１２７」のいずれかである。【０１０５】
このように、MEM、LBID、LBSN、SegOdr、SegAddを含む論理アドレスADD[31:0]により、ＣＰＵ１１０は第２メモリ１３０のアクセス位置を指定する。基本例について示した図５のADDにおけるBFIDの代わりに、LBIDとLBSNのペアによりバッファを特定している。以下、ADD[25:11]におけるLBID／LBSNのことをINQ[14:0]とも表記する。アドレス変換回路１２８は、論理アドレスADD[31:0]と状態保持回路１２６のセグメント割当情報から、物理アドレスM2AD[15:0]を生成する。【０１０６】
SegID：物理アドレスM2AD[15:0]のうち上位９ビットM2AD[15:7]はSegIDを示す。SegIDにより、セグメントサイズの単位で物理アドレス範囲が特定される。
セグメント内アドレス（SegAdd）：７ビットのM2AD[7:0]は、セグメント内アドレス（SegAdd）を示す。
このM2AD[15:0]により、第２メモリ１３０における物理アドレスが指定される。【０１０７】
図３０は、連結改良例において、割当制御回路１２０とその周辺の回路構成を示す図である。
基本例に関して図７に示した割当制御回路１２０との違いは、ＬＢＩＤキュー１９８、ＭＡＸＬＢＳＮテーブル２０２およびバッファＩＤ検索回路２００が追加され、バッファキュー１２２が無くなっている点にある。基本例に示したバッファキュー１２２の機能は、バッファＩＤ検索回路２００の一部として搭載されることになる。【０１０８】
（１）ＬＢＩＤキュー１９８
ＬＢＩＤキュー１９８は、新たに割り当て可能な連結空間のLBIDをＦＩＦＯ方式にて保存するメモリである。割当制御回路１２０が割り当てることができる連結空間は最大１６個なので、初期状態においては、ＬＢＩＤキュー１９８には１６個のLBIDが保持される。割当制御回路１２０は、タスクに新たな連結空間を割り当てるときには、ＬＢＩＤキュー１９８からLBIDを１つ取り出す。また、割当制御回路１２０は、既に設定されている連結空間を解放するときには、そのLBIDをＬＢＩＤキュー１９８に戻す。【０１０９】
ＬＢＩＤキュー１９８と割当制御回路１２０との間の信号は以下の５つである。
ａ．LBS_WR：割当制御回路１２０からＬＢＩＤキュー１９８への書込信号である。
ｂ．LBS_DI：割当制御回路１２０からＬＢＩＤキュー１９８へのLBID送信信号である。LBS_WRがアサートされると、LBS_DIに現れているLBIDがＬＢＩＤキュー１９８に書き込まれる。連結空間を解放するとき、割当制御回路１２０はLBS_WRをアサートする。
ｃ．LBS_RD_ABL：ＬＢＩＤキュー１９８にLBIDが保持されているか否か、いいかえれば、割り当て可能な連結空間が残っているか否かを示す。LBIDが保持されているときの値は「１」、保持されていないときの値は「０」となる。新たな連結空間を設定するときに、割当制御回路１２０はLBS_RD_ABLを見て、取得可能か否かを判定する。
ｄ．LBS_RE：割当制御回路１２０からＬＢＩＤキュー１９８への読出信号である。
ｅ．LBS_DO：ＬＢＩＤキュー１９８から割当制御回路１２０へのLBID送信信号である。LBS_REがアサートされると、LBS_DOに現れているLBIDがＬＢＩＤキュー１９８から割当制御回路１２０に読み出される。連結空間を新たに設定するとき、割当制御回路１２０はUALBS_RD_ABL=1であることを確認して、LBS_REをアサートする。【０１１０】
（２）ＭＡＸＬＢＳＮテーブル２０２
ＭＡＸＬＢＳＮテーブル２０２は、各連結空間についてのMAX_LBSNを保持する。ＭＡＸＬＢＳＮテーブル２０２と割当制御回路１２０との間の信号は以下の５つである。
ａ．MLB_RE：割当制御回路１２０からＭＡＸＬＢＳＮテーブル２０２への読出信号である。
ｂ．MLB_WE：割当制御回路１２０からＭＡＸＬＢＳＮテーブル２０２への書込信号である。
ｃ．MLB_LBID[6:0]：割当制御回路１２０がＭＡＸＬＢＳＮテーブル２０２にLBIDを指定するための信号である。
ｄ．MLB_MLS_I[7:0]：割当制御回路１２０がＭＡＸＬＢＳＮテーブル２０２にMAX_LBSNを指定するための信号である。MLB_WEがアサートされると、MLB_LBIDにより指定した連結空間について、MLB_MLS_Iにて指定したMAX_LSBNがＭＡＸＬＢＳＮテーブル２０２に書き込まれる。
ｅ．MLB_MLS_O[7:0]：ＭＡＸＬＢＳＮテーブル２０２から割当制御回路１２０へのMAX_LSBNの送信信号である。MLB_REがアサートされると、MLB_MLS_0にあらわれているMAX_LSBNがＭＡＸＬＢＳＮテーブル２０２から読み出される。【０１１１】
（３）バッファＩＤ検索回路２００
バッファＩＤ検索回路２００は、LBID/LBSN、すなわち、INQとBFIDとを対応づけて保持する。また、バッファＩＤ検索回路２００は、基本例にけるバッファキュー１２２のように空きBFIDを管理する。バッファＩＤ検索回路２００と割当制御回路１２０との間の信号は以下の７つである。
ａ．LBS_WR：割当制御回路１２０からバッファＩＤ検索回路２００への書込信号である。
ｂ．LBS_LBID[6:0]：割当制御回路１２０からバッファＩＤ検索回路２００へのLBID送信信号である。
ｃ．LBS_LBSN[7:0]：割当制御回路１２０からバッファＩＤ検索回路２００へのLBSN送信信号である。
ｄ．LBS_BFID_I[4:0]：割当制御回路１２０からバッファＩＤ検索回路２００にへのBFID送信信号である。上位１ビットLBS_BFID_0[4]が書込指示かクリア指示を示し、下位３ビットLBS_BFID_0[3:0]がBFIDを示す。書込指示のときにLBS_WRがアサートされると、LBS_LBID[6:0]とLBS_LBSN[7:0]にて指定されたLBID/LBSNにBFIDが対応づけられる。クリア指示のときにLBS_WRがアサートされると、LBS_LBID[6:0]とLBS_LBSN[7:0]にて指定されたLBID/LBSNとBFIDとの対応付けが解消される。LBS_BFID_I[4]=1で書込指示、LBS_BFID_I[4]=0でクリア指示である。
ｅ．LBS_BFID_0[4:0]：バッファＩＤ検索回路２００から割当制御回路１２０へのBFID送信信号である。上位１ビットLBS_BFID_0[4]が割当済か未割当を示し、下位３ビットLBS_BFID_0[3:0]がBFIDを示す。BS_LBID[6:0]とLBS_LBSN[7:0]にて指定されたLBID/LBSNについてBFIDが割り当てられているか否かを示す。LBS_BFID_0[4]=1で割当済、LBS_BFID_0[4]=0で未割当を示す。
ｆ．LBS_EMP_BFID[4:0]：空きBFIDがあるときには１、そうでないときには０となる信号である。
ｇ．LBS_LBID_EX：LBS_LBID[6:0]により指定された連結空間について、１以上のバッファ空間が割り当てられているときには１、そうでないときには０となる信号である。【０１１２】
図３１は、連結改良例におけるバッファＩＤ検索回路２００の回路構成図である。
ＩＮＱ情報回路２０６はバッファ空間ごとに設けられる。したがって、ＩＮＱ情報回路２０６は１６個設けられる。ＩＮＱ情報回路２０６ａはBFID=0に対応し、ＩＮＱ情報回路２０６ｂはBFID=1に対応している。各ＩＮＱ情報回路２０６は、比較回路２０８と保持回路２１０を備える。保持回路２１０は１６ビットのフリップフロップ回路である。保持回路２１０の保持するデータMTn[15:0]のうち（n：BFID）、MTn[14:0]はINQ、すなわち、LBID/LBSNを示し、MTn[15]はそのINQに対してバッファが割り当てられているか否かを示す。MTn[15]=0であれば未割当、MTn[15]=1であれば割当済であることを示す。たとえば、MT4[15]=1であって、MT4[14:0]にてLBID=3、LBSN=1であれば、「連結空間（ＬＢＩＤ：３）における先頭から２つ目のバッファ（ＬＢＳＮ：１）にはバッファ（ＢＦＩＤ：４）が割り当てられている」ことを示す。【０１１３】
デコーダ２１２にはLBS_BFID_I[3:0]とLBS_WRが入力される。LBS_WRがアサートされると、デコーダ２１２はLBS_BFID_I[3:0]にて指定されたBFIDに対応するＩＮＱ情報回路２０６に対して、MTn_WRをアサートする。LBS_BFID_I[4]=1、すなわち、書込指示であれば、LBS_LBID[6:0]とLBS_LBSN[7:0]がＩＮＱ情報回路２０６の保持回路２１０に書き込まれる。LBID/LBSNとBFIDが対応づけられたので、MTn[15]=1に設定される。このように、割当制御回路１２０は、LBIDとLBSN、BFIDを指定して、LBS_BFID_I[4]=1により書込指示したあと、LBS_WRをアサートすることによりLBIDとLBSNおよびBFIDをバッファＩＤ検索回路２００に対応づけて登録できる。保持回路２１０に保持されるMTn[15:0]のうち、割り当ての有無を示すMTn[15]はMTn_ID[4]としてセレクタ２０４に入力され、LBIDとLBSNの組み合わせを示すMTn[14:0]はMTn_IQ[14:0]として比較回路２０８に入力される。
なお、LBS_BFID_I[4]=Oによりクリア指示したあと、MTn_WRをアサートすると該当する保持回路２１０のデータはクリアされる。このときには、LBIDとLBSN、BFIDの関係が解消され、BFIDは再割り当て可能となる。【０１１４】
比較回路２０８は、LBIDとLBSNの組み合わせを示すMTn_IQ[14:0]と、割当制御回路１２０から送信されたLBS_LBID[6:0]、LBS_LBSN[7:0]を比較する回路である。MTn_IQ[14:0]におけるLBIDとLBSNの組み合わせと、LBS_LBID[6:0]、LBS_LBSN[7:0]におけるLBIDとLBSNの組み合わせが完全に一致したときにはMT_n_A=1、それ以外ではMT_n_A=0となる。すなわち、MT_n_Aは、LBS_LBID[6:0]、LBS_LBSN[7:0]により問い合わせがなされたLBID/LBSNの組み合わせが保持回路２１０に登録されているか否かを示す。
また、MTn_IQ[14:0]におけるLBIDとLBS_LBID[6:0]におけるLBIDが一致したときには、MT_n_LLEX=1、そうでなければMT_n_LLEX=0となる。すなわち、MT_n_LLEXは、LBS_LBID[6:0]により問い合わせがなされたLBIDが保持回路２１０に登録されているか否かを示す。したがって、MT_n_A=1のときには、必ずMT_n_LLEX=1となる。MT_n_AとMT_n_LLEXは、セレクタ２０４に入力される。また、セレクタ２０４には、MTn_ID[3:0]として所与の値が入力される。MTn_ID[3:0]はBFIDを示す信号である。【０１１５】
セレクタ２０４に入力される信号をまとめると以下の通りとなる。
ａ．MT_n_LLEX：割当制御回路１２０により指定されたLBIDの連結空間に、バッファ（BFID:k）が割り当てられているか（0:未割当、1:割当済）。
ｂ．MT_n_A：割当制御回路１２０により指定されたLBID/LSBNにより特定されるバッファ空間に、バッファ（BFID:n）が割り当てられているか（0:未割当、1:割当済）。
ｃ．MTn_ID[4]：MTn_ID[3:O]により示されるBFIDのバッファがいずれかの連結空間に割当済であるか（0:未割当、1:割当済）。
ｄ．MTn_ID[3:O]：BFID。【０１１６】
セレクタ２０４から割当制御回路１２０に出力される信号をまとめると以下の通りである。
ａ．LBS_EMP_BFID[4:0]：下位３ビットLBS_EMP_BFID[3:0]がBFIDを示し、上位１ビットのLBS_EMP_BFID[4]がLBS_EMP_BFID[3:0]に示されたBFIDが空いているか否かを示す。S_EMP_BFID[4]=1であれば空いていることを示し、LES_EMP_BFID[4]=0であれば空いていないことを示す。セレクタ２０４は、MTn_ID[4]をBFID=0からBFID=15までについて順番にチェックし、MTn_ID[4]=0（未割当）となっているBFIDが存在すれば、LES_EMP_BFID[4]=1、LES_EMP_BFID[3:0]=BFIDとして出力する。MTn_ID[4]=0となっているBFIDが存在しなければ、LES_EMP_BFID[4]=0、LES_EMP_BFID[3:0]=0として出力する。すなわち、割当制御回路１２０は、LBS_EMP_BFID[4:0]により、空きバッファの有無、空きバッファのBFIDを確認できる。基本例でいえば、図７に関連して説明したUAB_RD_ABLとUAB_DOに対応する信号であるといえる。【０１１７】
ｂ．LBS_BFID_O[4:0]：上位１ビットのLBS_BFID_O[4]が、LBS_LBID[6:0]、LBS_LBSN[7:0]におけるLBIDとLBSNの組み合わせに該当するBFIDの有無を示し、下位３ビットLBS_BFID_O[3:0]がそのBFIDを示す。LBS_BFID_O[4]=1であれば指定されたLBID/LBSNに対応するBFIDが存在することを示し、LBS_BFID_O[4]=0であれば存在しないことを示す。セレクタ２０４は、MTn_ID[4]とMT_n_AをBFID=0からBFID=15までについて順番にチェックし、MTn_ID[4]=1（割当済）かつMT_n_A=1（LBID/LBSNが一致）となっているBFIDが存在すれば、LBS_BFID_O[4]=1、LBS_BFID_O[3:0]=BFIDとして出力する。存在しなければ、LBS_BFID_O[4]=0、LBS_BFID_O[3:0]=0として出力する。すなわち、割当制御回路１２０は、LBS_BFID_O[4:0]により、LBS_LBID[6:0]、LBS_LBSN[7:0]にて指定したLBID/LBSNに対してバッファが割り当てられているか否か、割り当てられているバッファのBFIDを確認できる。【０１１８】
ｃ．LBS_LBID_EX：LBS_LBID[6:0]により指定されたLBIDについて、１以上のバッファが割り当てられているか否かを示す。LBS_LBID_EX=1であれば割り当てられていることを示し、LBS_LBID_EX=0であれば割り当てられていないことを示す。【０１１９】
図３２は、連結改良例における状態保持回路１２６の回路構成図である。
同図に示す状態保持回路１２６の構成は、図８に示した基本例の状態保持回路１２６とほとんど同様である。ただし、連結改良例の状態保持回路１２６においては、複数のセグメントレジスタ１４６に加えて、リンクレジスタ２１４がレジスタグループ１４０に含まれている。リンクレジスタ２１４には、そのBFIDに対応したINQ[14:0]、すなわち、LBIDとLBSNの組み合わせが登録され、Bn_BF_INQ[14:0]としてセレクタ１４４に出力されている。図２９により示される論理アドレスADD[31:16]がセレクタ１４４に入力されると、セレクタ１４４は、各リンクレジスタ２１４をチェックして、ADD[25:11]に示されるLBID/LBSNを登録しているレジスタグループ１４０を特定する。このような処理により、ADD[25:11]に示されるLBID/LBSNに対応するBFIDを特定する。【０１２０】
図３３は、連結改良例におけるアドレス変換回路１２８の回路構成図である。
同図に示すアドレス変換回路１２８の構成は、図１０に示した基本例のアドレス変換回路１２８とほとんど同様である。アドレス変換回路１２８には、ＣＰＵ１１０により指定される論理アドレスADDと、状態保持回路１２６から送出されるB_SOが入力される。論理アドレスADD[31:0]のうち、ADD[31:11]は、状態保持回路１２６のセレクタ１４４に入力され、セレクタ１４４は、ADD[31:11]に指定されたLBID/LBSNに対応するバッファ空間に関するセグメント割当情報をB_SOとしてアドレス変換回路１２８に送信する。該当するバッファ空間が存在しなければ第２メモリ１３０へのアクセスは失敗する。【０１２１】
ＣＰＵ１１０により指定される論理アドレスADD[31:0]のうち、ADD[10:7]により指定されるSegOdrは、アドレス変換回路１２８内のセレクタ１６８に入力される。SegOdr=mであれば、セレクタ１６８は、B_SOのうち該当するセグメント（番号：ｍ）のSegIDをM2AD[14:7]として送出する。また、ADD[6:0]のセグメント内アドレス（SegAdd）は、そのままM2AD[6:0]として送出される。こうして、論理アドレスADD[31:0]は物理アドレス[15:0]に変換される。【０１２２】
図３４は、連結改良例におけるアドレス変換処理の処理過程を示すフローチャートである。
ＣＰＵ１１０により実行されるタスクは、論理アドレスADD[31:0]により第２メモリ１３０のアクセス位置を指定する。アドレス変換回路１２８は、この論理アドレスADD[31:0]を取得する（Ｓ１０）。このとき、状態保持回路１２６は、論理アドレスADD[31:0]のうちADD[31:16]を取得する。状態保持回路１２６のセレクタ１４４は、ADD[31:11]のうちのINQ[14:0]によりアクセス先となるバッファ空間のLBID/LBSNを取得する（Ｓ１２２）。状態保持回路１２６のセレクタ１４４は、各レジスタグループ１４０のリンクレジスタ２１４をチェックして、該当するレジスタグループが存在するかを判定する（Ｓ１２４）。なお、割当制御回路１２０は、バッファＩＤ検索回路２００への問い合わせにより同等の判定を行ってもよい。【０１２３】
該当レジスタグループが存在しなければ（Ｓ１２４のＮ）、アクセスエラーを通知する（Ｓ１３２）。該当レジスタグループが存在すれば（Ｓ１２４のＹ）、状態保持回路１２６のセレクタ１４４は、該当レジスタグループ１４０からセグメント割当情報をB_SOとしてアドレス変換回路１２８に送る。【０１２４】
アドレス変換回路１２８はADD[10:7]よりセグメント番号を取得する（Ｓ１２６）。アドレス変換回路１２８のセレクタ１６８は、指定されたセグメント番号についてのSegIDをB_SOから特定する（Ｓ１２８）。こうして特定されたSegIDとADD[6:0]のセグメント内アドレスにより、物理アドレスM2AD[15:0]が生成される（Ｓ１３０）。【０１２５】
図３５は、連結改良例におけるバッファ取得処理の処理過程を示すフローチャートである。
その実行結果を保存するためのバッファ空間を要求するために、タスクは「バッファ取得要求」コマンドをＣＰＵインタフェース１３２を介して割当制御回路１２０に送信する。また、バッファに割り当てるべきセグメントの数に加えて、MAX_LBSNも設定パラメータとして送信する。割当制御回路１２０は、このバッファ取得要求をREQ_Dから読み出すと、以下に示すバッファ取得処理を開始する。【０１２６】
割当制御回路１２０は、バッファ取得要求コマンドを取得する（Ｓ２４）。割当制御回路１２０は、ＬＢＩＤキュー１９８のLBS_RD_ABLをチェックして、空いているLBIDが存在するかを判定する（Ｓ１３６）。空きLBIDがなければ（Ｓ１３６のＮ）、Ｓ１６２のエラー処理に移行する。空きLBIDが存在すれば（Ｓ１３６のＹ）、割当制御回路１２０はLBS_DOによりLBIDを１つ取得する（Ｓ１３８）。ここでは、取得したLBID=pとする。【０１２７】
次に、割当制御回路１２０は、バッファＩＤ検索回路２００のLBS_EMP_BFID[4]をチェックして空いているBFIDが存在するかを判定する（Ｓ１４０）。空きBFID、すなわち、割り当て可能なバッファがなければ（Ｓ１４０のＮ）、Ｓ１６２のエラー処理に移行する。空きバッファがあれば（Ｓ１４０のＹ）、割当制御回路１２０はLBS_EMP_BFID[3:0]によりBFIDを１つ取得する（Ｓ１４２）。ここでは、取得したBFID=nとする。【０１２８】
割当制御回路１２０は、LBS_BFID_I[3:0]にBFID=n、LBS_BFID_I[4]に書き込み指示のための「１」を設定し、LBS_LBID[6:0]にLBID=p、LBS_LBSN[7:0]にLBSN=0と設定した上でLBS_WRをアサートすることにより、BFID=nにLBID/LBSN=(p,0)を登録する（Ｓ１４４）。割当制御回路１２０は、設定パラメータのMAX_LBSNをＭＡＸＬＢＳＮテーブル２０２に登録する（Ｓ１４６）。こうして、LBIDとMAX_LBSNとがＭＡＸＬＢＳＮテーブル２０２に対応づけられる。【０１２９】
割当制御回路１２０は、セグメントキュー１２４のUAS_RD_ABLをチェックして、空いているSegIDが存在するかを判定する（Ｓ１４８）。空きセグメントがなければ（Ｓ１４８のＮ）、Ｓ１６２のエラー処理に移行する。空きセグメントがあれば（Ｓ１４８のＹ）、割当制御回路１２０はUAS_DOによりSegIDを１つ取得する（Ｓ１５０）。割当制御回路１２０は、テーブル保持部１３４のセグメントテーブルにおいて、BFID=nとSegIDおよび先ほどのLBID=p、LBSN=0を対応づけて設定する（Ｓ１５２）。このときバッファ（ＬＢＳＮ：０）のセグメント番号０から順番にSegIDが登録される。SegIDが登録されたセグメント番号については「割当済：１」、それ以外のセグメント番号については「未割当：０」を設定する。設定パラメータとして指定された数だけSegIDを取得していないときには（Ｓ１５６のＮ）、処理はＳ１４８に戻る。指定数だけ取得したときには（Ｓ１５６のＹ）、割当制御回路１２０は、取得したBFID=nを指定し、WRをアサートして、状態保持回路１２６の該当するレジスタグループ１４０にセグメント割当情報を登録する（Ｓ１５８）。【０１３０】
こうして、バッファとセグメントの新たな対応関係が状態保持回路１２６に登録されることになる。リンクレジスタ２１４には(LBID,LBSN)=(p,0)が登録される。割当制御回路１２０は、LBID=p、LBSN=0、BFID=nを結果パラメータとして「バッファ取得要求」の成功をRES_Dを介してＣＰＵ１１０に通知する（Ｓ１６０）。
一方、LBID、BFIDやSegIDの取得に失敗したときには（Ｓ１３６のＮ、Ｓ１４０のＮ、Ｓ１４８のＮ）、割当制御回路１２０は所定のエラー処理をした後に（Ｓ１６２）、「バッファ取得要求」の失敗を通知する（Ｓ１６４）。【０１３１】
図３６は、連結改良例におけるバッファ連結処理の処理過程を示すフローチャートである。
既に１以上のバッファを割り当てられている連結空間について、新たなバッファを連結させるとき、ＣＰＵ１１０は「バッファリンク要求」を割当制御回路１２０に入力する。バッファリンク要求の設定パラメータは、LBIDとLBSN、セグメント数である。LBIDにより連結処理の対象となる連結空間を特定し、LBSNにより連結空間における連結位置を特定する。たとえば、LBSN=2であれば、原則として、LBSN=3の位置に新たなバッファが連結される。ここでは、LBID=p、LBSN=qが設定パラメータとして指定されたとする。【０１３２】
割当制御回路１２０は、バッファリンク要求コマンドを取得する（Ｓ１７０）。割当制御回路１２０は、更に、設定パラメータからLBID=pとLBSN=qを取得する（Ｓ１７２）。割当制御回路１２０は、バッファＩＤ検索回路２００のLBS_EMP_BFID[4]をチェックして空いているBFIDが存在するかを判定する（Ｓ１７４）。空きBFIDがなければ（Ｓ１７４のＮ）、Ｓ２００のエラー処理に移行する。空きBFIDがあれば（Ｓ１７４のＹ）、割当制御回路１２０はLBS_EMP_BFID[3:0]によりBFIDを１つ取得する（Ｓ１７８）。取得したBFID=nとする。【０１３３】
設定パラメータにより指定されたLBSN=qについて、q+1=MAX_LBSNでなければ（Ｓ１８０のＮ）、LBSN=q+1が新たなバッファの連結位置となる。もし、q+1=MAX_LBSNであれば（Ｓ１８０のＹ）、LBSN=0の位置にバッファを連結する。ただし、バッファ（ＬＢＳＮ：０）が割当済であれば（Ｓ１８２のＹ）、Ｓ２００のエラー処理に移行する。バッファ（ＬＢＳＮ：０）が解放されていれば（Ｓ１８２のＮ）、バッファ（ＬＢＳＮ：０）に新たなバッファの連結位置となる（Ｓ１８４）。割当制御回路１２０は、LBID=p、LBSN=q+1 or 0とBFID=nの組み合わせをバッファＩＤ検索回路２００に登録する（Ｓ１８６）。【０１３４】
割当制御回路１２０は、セグメントキュー１２４のUAS_RD_ABLをチェックして、空いているSegIDが存在するかを判定する（Ｓ１８８）。空きセグメントがなければ（Ｓ１８８のＮ）、Ｓ２００のエラー処理に移行する。空きセグメントがあれば（Ｓ１８８のＹ）、割当制御回路１２０はUAS_DOによりSegIDを１つ取得する（Ｓ１９０）。割当制御回路１２０は、テーブル保持部１３４にBFID=nとSegIDおよび先ほどのLBID=p、LBSN=q+1 or 0を対応づけて設定する（Ｓ１９２）。SegIDが登録されたセグメント番号については「割当済：１」、それ以外のセグメント番号については「未割当：０」を設定する。設定パラメータとして指定された数だけSegIDを取得していないときには（Ｓ１９４のＮ）、処理はＳ１８８に戻る。指定数だけ取得したときには（Ｓ１９４のＹ）、割当制御回路１２０は、取得したBFID=nを指定し、WRをアサートして、状態保持回路１２６の該当するレジスタグループ１４０にセグメント割当情報を登録する（Ｓ１９６）。【０１３５】
こうして、バッファとセグメントの新たな対応関係が状態保持回路１２６に登録されることになる。また、リンクレジスタ２１４には、(LBID,LBSN)=(p,q+1 or 0)が登録されることになる。割当制御回路１２０は、LBSN=q+1 or 0、BFID=nを結果パラメータとして「バッファリンク要求」の成功をRES_Dを介してＣＰＵ１１０に通知する（Ｓ１９８）。
一方、BFIDやSegIDの取得に失敗したときには（Ｓ１７４のＮ、Ｓ１８２のＮ、Ｓ１８８のＮ）、割当制御回路１２０は所定のエラー処理をした後に（Ｓ２００）、「バッファリンク要求」の失敗を通知する（Ｓ２０２）。【０１３６】
図３７は、連結改良例におけるバッファ全解放処理の処理過程を示すフローチャートである。
連結改良例においても、バッファを全解放するとき、タスクは「バッファ全解放要求」コマンドをＣＰＵインタフェース１３２を介して割当制御回路１２０に送信する。連結改良例におけるバッファ全解放要求の設定パラメータは、解放対象となる連結空間のLBIDと解放対象となるLBSNである。設定パラメータとしてLBID=p、LBSN=qが指定されたとする。【０１３７】
割当制御回路１２０は、バッファ全解放要求コマンドを取得する（Ｓ２０６）。割当制御回路１２０は、設定パラメータにて指定されたLBID=p、LBSN=qを取得する（Ｓ２０８）。割当制御回路１２０は、バッファＩＤ検索回路２００に問い合わせて、この(LBSN,LBID)=(p,q)の組み合わせについてバッファが割り当てられているかを判定する（Ｓ２１０）。バッファが割り当てられていなければ（Ｓ２１０のＮ）、割当制御回路１２０は「バッファ全解放要求」の「失敗」をＣＰＵ１１０に通知する（Ｓ２２８）。バッファが割り当てられていれば（Ｓ２１０のＹ）、LBS_BFID_O[3:0]より割り当てられているBFIDを取得する（Ｓ２１２）。BFID=nであるとする。次に、割当制御回路１２０は、このBFID=nに対応するレジスタグループ１４０のデータをBS_RDから読み出し、該当バッファ空間におけるセグメントのうち、「割当済：１」となっているセグメントが存在しないときには（Ｓ２１４のＮ）、「バッファ全解放要求」は無効であるため、「失敗」を通知する（Ｓ２２８）。【０１３８】
「割当済：１」のセグメントが存在するときには（Ｓ２１４のＹ）、割当制御回路１２０は、「割当済：１」に設定されているセグメントのSegIDをセグメントキュー１２４に投入する（Ｓ２１６）。更に、割当制御回路１２０は、CLRをアサートして、レジスタグループ（ＩＤ：ｎ）の全セグメントレジスタ１４６について「未割当：０」に設定する（Ｓ２２０）。こうして、レジスタグループ１４０（ＩＤ：ｎ）におけるバッファとセグメントの関係を解消し、割り当てられていたセグメントを再割当可能な状態に戻す。割当制御回路１２０は、バッファＩＤ検索回路２００に対して、LBS_BFID[4]=0にクリア設定をした上で、LBS_LBIDとLBS_LBSN、LBS_BFID_Iにより、BFID=nと(LBID,LBSN)=(p,q)の関係を解消する（Ｓ２２０）。こうして、バッファＩＤ検索回路２００におけるバッファと連結空間の関係を解消する。もし、指定された連結空間（ＬＢＩＤ：ｐ）について、１つもバッファが割り当てられていなければ（Ｓ２２２のＹ）、割当制御回路１２０は、LBID=pをＬＢＩＤキュー１９８に投入し、LBID=pを再割当可能な状態に戻す（Ｓ２２４）。１つでもバッファが割り当てられていれば（Ｓ２２２のＮ）、Ｓ２２４の処理はスキップされる。設定パラメータのLBID=pに対してバッファが割り当てられているかは、LBS_LBID_EXの値により判定される。最後に、割当制御回路１２０は、「バッファ全解放要求」の成功をRES_Dを介してＣＰＵ１１０に通知する（Ｓ２２６）。
バッファ部分解放処理の処理過程は、基本例に示した内容と同等である。【０１３９】
図３８は、連結改良例に関し、キャッシュコントロール機能を搭載した状態保持回路１２６の回路構成図である。
図１８の状態保持回路１２６と基本的な構成は同等である。ただし、レジスタグループ１４０は、新たにリンクレジスタ２１４を含む代わりに、バッファＩＤレジスタ１７０を含まない構成となっている。図１８と同じく、レジスタグループ１４０が２つだけ存在するとして説明する。全バッファのセグメント割当情報は退避メモリ１７４に保持されている。そのうち、２つのバッファのセグメント割当情報は、レジスタグループ１４０ａかレジスタグループ１４０ｂのいずれかに保持される。リンクレジスタ２１４は、INQ、すなわち、当該レジスタグループ１４０に対応するLBID/LBSNを保持する。【０１４０】
割当制御回路１２０がセグメント割当情報を登録するためにWRをアサートすると、ＣＡＳＨ制御回路１７２は退避メモリ１７４において該当する領域のデータを更新する。該当バッファ空間のデータがレジスタグループ１４０に存在すれば更新内容を反映させ、存在しなければ該当バッファ空間の更新後のデータをいずれかのレジスタグループ１４０にロードする。【０１４１】
割当制御回路１２０がセグメント割当情報をクリアするためにCLRをアサートすると、ＣＡＳＨ制御回路１７２は退避メモリ１７４における退避メモリ１７４において該当する領域のデータをクリアする。該当バッファ空間のデータがレジスタグループ１４０に存在すればレジスタグループ１４０のすべてのセグメントレジスタ１４６に「未割当」設定する。
割当制御回路１２０がセグメント割当情報を読み出すためにRDをアサートすると、ＣＡＳＨ制御回路１７２は、退避メモリ１７４において該当する領域のデータをBS_RDにより出力する。【０１４２】
ＣＰＵ１１０から論理アドレスD[31:0]が指定されると、セレクタ１４４は、INQ[14:0]を抽出し、リンクレジスタ２１４をチェックして、該当バッファ空間についてのデータがレジスタグループ１４０が存在するか判定する。存在すれば、そのレジスタグループ１４０のセグメント割当情報をB_SOとしてアドレス変換回路１２８に出力する。もし、該当バッファ空間についてのデータがレジスタグループ１４０に存在しなければ、NO_CACHEをアサートする。
一方、ADD[31:0]はBF_INQ[14:0]に変換され、バッファＩＤ検索回路２００に送出されている。状態保持回路１２６のキャッシュコントロール機能に対応するため、バッファＩＤ検索回路２００はこのBF_INQ[14:0]により指定されたLBID/LBSNに対応するBFIDをLB_BFID[4:0]により退避メモリ１７４に返信する機能を備える。このようなバッファＩＤ検索回路２００の回路構成については、次の図３９に関連して説明する。
ＣＡＳＨ制御回路１７２は、状態保持回路１２６から返信されたデータに基づいて退避メモリ１７４における該当バッファについてのセグメント割当情報を選択し、いずれかのレジスタグループ１４０にロードしてからB_SOとして出力させる。【０１４３】
図３９は、図３８の状態保持回路１２６のキャッシュコントロール機能に対応するバッファＩＤ検索回路２００の回路構成図である。
図３１に示したバッファＩＤ検索回路２００との違いは、状態保持回路１２６からBF_INQ[14:8]としてLBID、BF_INQ[7:0]としてLBSNを入力され、BF_INQ[14:0]により指定されたLBID/LBSNに対応するBFIDをLB_BFID[4:0]として状態保持回路１２６に出力することである。
そのため、ＩＮＱ情報回路２０６には、第２比較回路２１６が新たに追加されている。第２比較回路２１６は、BF_INQ[14:0]のLBID/LBSNと保持回路２１０のLBID/LBSNを比較して、両者が一致すればMT_n_Bをアサートする。このような構成により、セレクタ２０４はBF_INQ[14:0]に対応するBFIDをLB_BFID[4:0]として状態保持回路１２６に出力する。【０１４４】
以上、基本例および移行改良例と連結改良例にて示したセグメント単位のメモリ管理によれば、第２メモリ１３０の利用効率を高めることができる。また、ＣＰＵ１１０にて実行される各種アプリケーション・タスクは論理アドレスによりバッファ空間にアクセスできる。特に、移行改良例に示したメモリ管理方法によれば、複数のバッファ空間の間でセグメントの移行を行うときでも論理アドレスの連続性を保つことができる。このため、メモリの利用効率を高めつつも、プログラミング負担を軽減できる。
また、連結改良例に示したメモリ管理方法によれば、単一のバッファ空間のサイズ以上に論理アドレス範囲を拡大できる。このため、確保すべきメモリサイズが大きく変化するようなアプリケーションであっても、メモリ管理装置１００の回路構成を過度に複雑化・大規模化することなく対応できる。【０１４５】
本実施例のメモリ管理装置１００のユニークなポイントは、上記したメモリ管理機能をハードウェアロジックにより実現している点にもある。ＣＰＵ１１０にて実行されるアプリケーション・タスクが「バッファ取得要求」や「バッファ全解放要求」といったコマンドをメモリ管理装置１００に入力すると、メモリ管理装置１００はＣＰＵ１１０の演算能力にほとんど依存せずにコマンドを実行できる。
本実施例に示したメモリ管理機能と同等の機能をソフトウェアＯＳによって実現しようとすれば、ＯＳ自体がＣＰＵ１１０の演算能力を利用して動作することになる。汎用プロセッサであるＣＰＵ１１０に比べて、メモリ管理装置１００はメモリ管理専用回路であるためオーバーヘッドが大きく低減される。このようなオーバーヘッドの低減は、システム全体としてのスループットを格段に向上させるだけではなく消費電力の抑制にもつながる。高速動作・小記憶容量・低消費電力を設計要件とする組込システムには、特に有効である。【０１４６】
通常、Ｃ言語のmalloc関数のようなヒープメモリを確保するためのプログラムコードは、実行コストが高くつくコードである。そのため、ヒープメモリの確保・解放を頻繁に繰り返すようなコンピュータプログラムは処理パフォーマンスが悪くなる。そこで、通常は、初期化時等にあらかじめ大きめのサイズにてメモリ領域を確保しておくことが多い。しかし、このようなプログラムを実行すると、「割当領域として確保されているが実際には使用されていないメモリ領域」が発生しやすい。メモリ容量の小さなシステムにとっては許容しがたい状況となる。
これに対して、本実施例に示したメモリ管理装置１００の場合、ＣＰＵ１１０に対する負荷をほとんどかけることなく、ヒープメモリの確保や解放等のメモリ管理処理を実行できる。このため、「ヒープメモリの確保・解放を頻繁に繰り返すプログラム」であってもそれほど実行コストが高くならない。いいかえれば、「必要なときに必要なときだけメモリを確保し、不必要になったときに不必要になっただけメモリを解放する」というプログラムを高パフォーマンスにて実行できるので、コーディング面からもメモリ利用率の高めることができる。【０１４７】
最初に述べたように、ＯＳの機能の中でもメモリ管理機能は中核となる機能である。この中核機能をハードウェアとしてのメモリ管理装置１００により提供できるため、本実施例のメモリ管理装置１００は、さまざまな電子機器のメモリ利用効率、ひいては、処理パフォーマンスを改善することが期待される。【０１４８】
以上、本発明を実施例をもとに説明した。実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。【０１４９】
請求項に記載の「実行制御回路」の機能は、本実施例において主としてＣＰＵ１１０の機能として実現される。請求項に記載の「メモリ」の機能は、本実施例においては主として第２メモリ１３０の機能として実現される。請求項に記載の「範囲番号」は、本実施例においてはセグメント番号（SegOdr）として表現されている。請求項に記載の「セグメントＩＤの無効化」とは、本実施例においては「未割当：０」の設定として表現されている。同様に「有効に登録されているセグメントＩＤ」とは、本実施例においては割当済みのセグメントとして表現されている。請求項に記載の「退避制御回路」の機能は、本実施例においては主としてＣＡＳＨ制御回路１７２の機能として実現される。請求項に記載の「記録状態情報」は、本実施例においてはBn_Sm[19:8]の末尾アドレスとして表現されている。請求項に記載の「連結空間キュー」は、本実施例においては主としてＬＢＩＤキュー１９８として表現されている。請求項に記載の「連結ＩＤ」と「位置番号」は、本実施例においてはそれぞれLBID、LBSNとして表現されている。
請求項に記載の「第１のバス」は、本実施例においては主としてＣＰＵ１１０と割当制御回路１２０を接続するデータバスDTが対応し、「第２のバス」は、本実施例においては割当制御回路１２０と状態保持回路１２６をテーブル保持部１３４を介して、または、介さずに接続するBS_RDやBS_WR等の複数の信号線が対応し、「第３のバス」は、本実施例においては主として状態保持回路１２６とアドレス変換回路１２８を接続するB_SOの送信信号線が対応し、「第４のバス」は、本実施例においては割当制御回路１２０とセグメントキュー１２４を接続する複数の信号線が対応し、「第５のバス」は、本実施例においては割当制御回路１２０とバッファキュー１２２を接続する複数の信号線が対応する。
このほかにも、請求項に記載の各構成要件が果たすべき機能は、本実施例において示された各機能ブロックの単体もしくはそれらの連係によって実現されることも当業者には理解されるところである。
【産業上の利用可能性】
【０１５０】
本発明によれば、効率的かつ高速なメモリ管理を実現される。
【図１】
2008084531.tif 000003
【図２】
2008084531.tif 000004
【図３】
2008084531.tif 000005
【図４】
2008084531.tif 000006
【図５】
2008084531.tif 000007
【図６】
2008084531.tif 000008
【図７】
2008084531.tif 000009
【図８】
2008084531.tif 000010
【図９】
2008084531.tif 000011
【図１０】
2008084531.tif 000012
【図１１】
2008084531.tif 000013
【図１２】
2008084531.tif 000014
【図１３】
2008084531.tif 000015
【図１４】
2008084531.tif 000016
【図１５】
2008084531.tif 000017
【図１６】
2008084531.tif 000018
【図１７】
2008084531.tif 000019
【図１８】
2008084531.tif 000020
【図１９】
2008084531.tif 000021
【図２０】
2008084531.tif 000022
【図２１】
2008084531.tif 000023
【図２２】
2008084531.tif 000024
【図２３】
2008084531.tif 000025
【図２４】
2008084531.tif 000026
【図２５】
2008084531.tif 000027
【図２６】
2008084531.tif 000028
【図２７】
2008084531.tif 000029
【図２８】
2008084531.tif 000030
【図２９】
2008084531.tif 000031
【図３０】
2008084531.tif 000032
【図３１】
2008084531.tif 000033
【図３２】
2008084531.tif 000034
【図３３】
2008084531.tif 000035
【図３４】
2008084531.tif 000036
【図３５】
2008084531.tif 000037
【図３６】
2008084531.tif 000038
【図３７】
2008084531.tif 000039
【図３８】
2008084531.tif 000040
【図３９】
2008084531.tif 000041
【国際調査報告】
2008084531.tif 000042
2008084531.tif 000043
2008084531.tif 000044
2008084531.tif 000045