先行技術のコンピュータシステムは、プログラムおよびデータファイルを保持するための不揮発性大容量記憶装置(たとえば、ハードディスクドライブ)を含む。これらのファイルの内容は、RAM(「ランダムアクセスメモリ」)タイプのシステムメモリ内にロードされ、CPU(「中央処理装置」)によりアクセスまたは実行される。この動作は、一般に、アプリケーションプログラムに代わってオペレーティングシステムにより実行される。先行技術のコンピュータシステムおよびオペレーティングシステムは、仮想メモリおよびデマンドページングをサポートしている。アプリケーションは、システムメモリアドレスを直接使用して、アプリケーションが使用するコードおよびデータを指示するのではなく、代わりに「仮想アドレス」を使用して記憶場所を指示し、記憶場所は、CPU回路によりインプリメントされ、オペレーティングシステムにより制御されるページング機構により、システムメモリアドレスに変換される。その結果、オペレーティングシステムは、プログラムおよびデータファイル全体をRAM内にロードする必要性をなくすことができる。むしろ、システムメモリは特定サイズの塊(「ページ」と呼ばれる)に分割され、オペレーティングシステムは、この特定のページにアクセスした時に、ファイル内容の対応する塊を各々のメモリページ内にロードする。このプロセスは、通常、「デマンドページング」と呼ばれる。
この方法の不利な点の1つに、RAMがプログラムおよびデータファイルの内容を保持する必要があり、他の目的に使用可能なRAMの量が減少することがある。さらに、一般に、場合に応じて内容をRAM内にダウンロードする必要がある。したがって、先行技術のコンピュータシステムによっては、RAMと同様に、CPUが直接アクセスできる別のタイプの不揮発性記憶装置(「メモリアドレス指定デバイス」)が提供されている。メモリアドレス指定デバイスの先行技術の一実施態様は、フラッシュメモリカードである。メモリアドレス指定デバイスを用いれば、CPUは、最初にRAM内に内容をダウンロードすることなく、メモリアドレス指定デバイス上に格納されたコードおよびアクセスデータを直接実行できるようになる。メモリアドレス指定デバイス上に存在するコードを直接実行するこの方法は、「直接実行」と呼ばれる。仮想メモリをサポートするオペレーティングシステム上で実行されるアプリケーションに直接実行機能を提供するには、オペレーティングシステムは、アプリケーションのアドレス空間の特定の仮想アドレスが、メモリアドレス指定デバイスによりサポートされるアドレスの範囲内のシステムメモリアドレスにマップされるように、ページング機構を制御する必要がある。
先行技術のその他のコンピュータシステムは、仮想化機能を提供する。仮想化は、単一のコンピュータシステムを実行する「ハイパーバイザ」と呼ばれることの多いソフトウェアプログラムによってインプリメントされるが、複数の「ゲスト」オペレーティングシステムが各々別個の「仮想マシン」で同時に実行をすることができるようにする。オペレーティングシステムから各々の仮想マシンを見ると、仮想マシン自体が、CPU、RAMおよびI/Oデバイスを備えた実際のコンピュータシステムとして内部で動作しているように見える。これらの仮想コンポーネントに対するアクセスは、ハイパーバイザによって傍受され、実際のコンポーネントに対するアクセスに変換される。これによって、コンピュータシステムのリソースを複数のゲストオペレーティングシステム間で共有し、システムリソース全体の利用率を増加させることができる。
いくつかの先行技術の仮想化コンピュータシステムの不利な点の1つとして、同じプログラムまたはデータが同じハイパーバイザ下で動作する複数のゲストにより同時にアクセスされることと、各々のゲストオペレーティングシステムは、それらの内容を保持するための仮想RAMを別個に割り当て、ひいては、ハイパーバイザが、前記内容の複数の同じコピーを物理RAMに割り当てる必要性が出てくる点が挙げられる。これは、他の目的に使用することのできるメモリが減少することを意味し、これによって効率的に同時に動作可能なゲストの数が制限されてしまう。したがって、先行技術のハイパーバイザによっては、複数のゲストから同時にアクセスできる物理メモリのセグメント(「共有メモリセグメント」)が提供されている。プログラムまたはデータファイルを共有メモリセグメント内に格納することにより、複数のゲストが、前記ファイルに同時にアクセスすることができ、最初に内容を仮想RAM内にダウンロードする必要はなくなる。ゲストオペレーティングシステムから前記共有セグメントを見ると、物理メモリアドレス指定デバイスであるかのように見える。
データおよびプログラムファイルは、一般に、標準のファイルシステムレイアウトを使用するデバイス上に格納され、オペレーティングシステムによっては、異なる利用シナリオのために最適化された複数の異なるファイルシステムレイアウトを使用することができる。これをできるようにするため、先行技術のオペレーティングシステムは、一般に、複数のコンポーネント状に構造化される。オペレーティングシステムによっては、中央ファイルおよびメモリ管理コンポーネント、複数のファイルシステムドライバ、並びに複数のI/Oデバイスドライバが存在する。したがって、オペレーティングシステムは、ファイルおよびメモリ管理コンポーネントと組み合わせて、ファイルシステムドライバおよびI/Oデバイスドライバの適切な対を使用することにより、サポートされる何れかのI/Oデバイス上で、サポートされる何れかのファイルシステムレイアウトを使用できるようにする。しかし、先行技術のオペレーティングシステムは、既存のファイルシステムドライバを使用して、直接実行をできるようにする形態でメモリアドレス指定デバイスにアクセスすることはできない。メモリアドレス指定デバイスに対するアクセスをサポートする直接実行は、モノリシック形態でインプリメントされる。
実際、先行技術のオペレーティングシステムのインプリメンテーションによっては、標準ファイルシステムレイアウトを使用して、メモリアドレス指定デバイス上にデータを格納することができず、むしろ、このようなデバイスに特有の方法で、これらのデバイス上のデータを配列する必要がある。この配列には、特にI/Oデバイスおよびメモリアドレス指定デバイスの両方を使用するコンピュータシステムの場合、不利な点が複数ある。異なるファイルシステムレイアウトをサポートすることにより、システム管理はさらに難しくなる可能性がある。異なるレイアウトをフォーマット、管理、バックアップおよび復元するには、異なるツールが必要になる。既存のファイルの集合をI/Oデバイスからメモリアドレス指定デバイス、またはこの逆に移行することはさらに難しくなる。メモリアドレス指定デバイスにより要求される特定のレイアウトは、存在するすべての特徴(たとえば、アクセス制御および特権チェックをインプリメントする)に、標準のファイルシステムレイアウトを提供するわけではない。
もう1つの先行技術のインプリメンテーション(zSeries(IBM Corporationの商標)上のLinux(Linus Torvaldsの米国およびその他の国における商標、以下、同様なので略)用XIP2FSファイルシステム)は、Linuxオペレーティングシステムが提供する標準ファイルシステムフォーマットの1つである第2拡張ファイルシステム(「ext2」)を使用して、プログラムおよびデータを仮想メモリアドレス指定デバイス上(z/VM(IBM Corporationの商標)ハイパーバイザにより提供される共有メモリセグメント)に格納するためのサポートを提供する。しかし、この方法には、上記の段落に記載した不利な点の殆どがあり、他の標準Linuxファイルシステムフォーマットを使用することができないほか、XIP2FSは、ext2のすべての特徴を提供するわけではない(たとえば、XIP2FSは、書き込みアクセスをサポートしない)。
XIP2FSのもう1つの不利な点は、XIP2FSがオペレーティングシステムの上記のコンポーネント構造に組み込まれないことであり、XIP2FSが、ext2ファイルシステムレイアウトを使用してファイルにアクセスした場合も、XIP2FSは、Linux ext2ファイルシステムドライバを使用してアクセスするのではなく、代わりにext2ファイルシステムレイアウトにアクセスするのに必要なアクセスロジックを再インプリメントする。この場合もやはり、完全なext2ロジックの一部のみが再インプリメントされるため、XIP2FSはext2のすべての特徴をサポートするわけではない。さらに他の不利な点として、Linuxオペレーティングシステムの標準ext2ファイルシステムコンポーネントは、長期にわたって開発され、新しい特徴が追加され、たとえば、Linuxカーネルバージョン2.6が提供されたext2ファイルシステムドライバのバージョンは、非常に大きいディレクトリ構造、およびより精巧なアクセス制御機構に対してより迅速にアクセスするためのサポートを追加した。XIP2FSは、ext2ドライバのこのような強化から自動的に効果を得るのではなく、必要なすべての特徴をXIP2FSコード内に再インプリメントする必要がある。
図1は、コンピュータシステム10のブロック図を示す。コンピュータシステム10は、パーソナルコンピュータ、メインフレームコンピュータ、または他の何らかのタイプのコンピュータもしくはデータ処理システムで良い。コンピュータシステム10は、以下に述べるように、別のコンピュータシステム上で動作するハイパーバイザにより提供される仮想マシンでも良い。コンピュータシステム10は、中央演算処理装置(「CPU」)11と、ランダム−アクセスメモリ(「RAM」)12と、メモリアドレス指定デバイス13と、I/Oベースデバイス14とを備える。一実施態様では、メモリアドレス指定デバイス13はフラッシュメモリカードで良い。他の実施態様では、メモリアドレス指定デバイス13は、CPU11がメモリ動作のために直接アクセスできる何らかのデバイスで良い。一実施態様では、I/Oベースデバイス14はハードディスクドライブで良い。他の実施態様では、I/Oベースデバイス14は、I/O操作を使用して、データをRAM12からコピーするか、またはRAM12にコピーできる何らかのデバイスで良い。コンピュータシステム10は、メモリアドレス指定デバイス13またはI/Oベースデバイス14あるいはその両方の複数のインスタンスも含む場合がある。CPU11、RAM12、並びにデバイス13および14は、システムバス15に結合される。CPU11は、メモリ動作のために、RAM12およびメモリアドレス指定デバイス13に直接アクセスすることができる。CPU11は、メモリ動作のためにI/Oベースデバイス14に直接アクセスすることはできないが、データは、I/O操作を使用して、デバイス14からRAM12に、あるいは逆にコピーすることができる。コンピュータシステム10は、1つまたは複数のアプリケーションプログラムを実行させることが可能なオペレーティングシステムを実行させる(以下で詳細に説明する)。オペレーティングシステムは、コンピュータシステム10の様々なリソース(CPU11、RAM12、デバイス13および14)に対するアプリケーションプログラムによるアクセスを管理および調整する。
いくつかの実施態様では、コンピュータシステム10は、別のコンピュータシステム上で動作するハイパーバイザによりエミュレートされる仮想マシンで良い。図2は、コンピュータシステム10が、仮想CPU11、仮想RAM12、並びに仮想デバイス13および14から成るような一実施態様を示す。すべての仮想コンポーネントはハイパーバイザ21により提供され、ハイパーバイザ21は、別のコンピュータシステム20上で動作するソフトウェアプログラムであり、それ自体はCPU、RAMおよびデバイスから成る。ハイパーバイザ21は、完全にソフトウェアによって、またはコンピュータシステム20が提供する視覚化ハードウェア支援機能を使用することによって、仮想コンポーネント10〜14を提供する。仮想マシン10のほかに、他の仮想マシン22が、コンピュータシステム20上のハイパーバイザ21下で同時に動作する。一実施態様では、ハイパーバイザ21は、IBM Corp.が製造販売するz/VM(IBM Corporationの商標)ソフトウェアプログラムであって、IBMeServer(IBM Corporationの商標)zSeries(IBM Corporationの商標)メインフレームコンピュータ上で動作するプログラムで良い。この実施態様では、コンピュータシステム10は、z/VMにより提供される仮想マシンで良く、メモリアドレス指定デバイス13は、z/VMに基づいて画定される非連続保管セグメント(「DCSS)」)で良い。DCSSは、複数の仮想マシンが同時に使用可能なz/VMにより管理されるメモリのセグメントである。z/VMは、複数の仮想マシンがDCSSを同時に使用可能である場合でも、コンピュータシステム20の実RAM内におけるDCSSの内容の1つのコピーのみを保持する。
CPU11がメモリ動作のために直接アクセス可能なすべてのコンポーネントは、図3に示すように、コンピュータシステム10のシステムメモリアドレス空間30を構成する。RAM12およびメモリアドレス指定デバイス13は、システムメモリアドレス空間30の一部である。さらに、その他のコンポーネント(図示しない)は、システムメモリアドレス空間30、たとえば読出し専用メモリ(「ROM」)またはビデオカードフレームバッファである。CPU11により実行されるすべてのプログラムインストラクション、およびCPU11により実行されるインストラクションによりアクセスされるすべてのメモリデータは、実行が生じた時点で、システムメモリアドレス空間30内に存在しなければならない。使用可能なメモリの見掛けのサイズを増加し、同じコンピュータシステム上で同時に動作する異なるアプリケーションプログラムが、偶発的に互いに他のメモリを修正するのを防止するため、オペレーティングシステムは、各々のアプリケーションプログラムに「仮想アドレス空間」を提供し、仮想アドレス空間内のシステムメモリアドレス空間の選択部分に対するアクセスを提供する。CPU11は、アプリケーションコードを実行するが、アプリケーションの仮想アドレス空間内に存在するメモリにのみアクセスすることができる。仮想アドレス空間とシステムメモリアドレス空間との間で変換することができるように、仮想アドレス空間とシステムメモリアドレス空間の両方が、一般に「ページ」と呼ばれる等サイズの塊状に分割される。
図3は、コンピュータシステム10のシステムメモリアドレス空間30を示す。さらに、アプリケーションプログラムの仮想アドレス空間31が示されている。仮想アドレス空間31でアドレス指定できる各々のページについては、当該ページの状態を実際に記述するページ記述子が存在しなければならない。ページは、ある時点でシステムメモリアドレス空間30内に存在しても、あるいは存在しなくても良い。ページがシステムメモリアドレス空間30内に存在する場合、ページ記述子はその事実を指示し、システムメモリアドレス空間30内のページの位置を指示することになる。ページがシステムメモリアドレス空間30内に存在しない場合、記述子はその事実を指示し、アプリケーションプログラムがこのページを介してアクセスしようとしている内容の場所をオペレーティングシステムが確認できるようにする追加の情報を含むことになる。仮想アドレス空間に対するすべてのページ記述子の集合は、ページテーブルと呼ばれる。仮想アドレス空間のページテーブルは、オペレーティングシステムにより維持される。
CPU11が仮想アドレス空間31でアプリケーションコードを実行している間、CPU11によりアクセスされるすべてのメモリアドレスは、仮想アドレス空間31用のページテーブルを使用して、仮想アドレス空間31内の仮想アドレスからシステムメモリアドレス空間30内のシステムメモリアドレスに変換される。この変換はページング機構により実行され、ページング機構は、ハードウェアもしくはソフトウェアインプリメンテーション、またはこれらの組合せで良い。実施態様によっては、ページング機構は、CPU11内に存在するページングユニットによりインプリメントされる。CPU11が、システムメモリアドレス空間30に対応するページを現在持たない仮想アドレス空間31内のページにアクセスする場合、ページング機構は、CPU11にページ障害割込みを生成させる。この割込みにより、「ページ障害ハンドラ」と呼ばれるオペレーティングシステムコードが、必要な内容をシステムメモリアドレス空間30内のいくつかのページ内にもたらし、ページテーブルを更新して、仮想ページをシステムメモリアドレス空間30内のこのページにマップする。次に、アプリケーションは、ページの実行およびアクセスを継続する。このプロセスは、一般に、「デマンドページング」と呼ばれる。
図3に示す実施例の状況では、仮想アドレス空間31は、現在4つのページを保持している。3つのページ(32a〜32c)は、現在実行されているアプリケーションコードを含み、1つのページ(32d)は、アプリケーションによりアクセスされるデータを含む。ページ32a〜32cに含まれるアプリケーションコードは、ブロック34a〜34c内のI/Oベースデバイス14上に存在するアプリケーションプログラムファイルからロードされる。アプリケーションコードページ32aおよび32bは、システムメモリアドレス空間30内に現在実際に存在しており、RAM12のページ33aおよび33b内に存在する。同様に、データページ32dはシステムメモリアドレス空間内に存在しており、RAM12のページ33d内に存在する。アプリケーションコードページ32cは、現在、システムメモリアドレス空間30内に存在しない。アプリケーションがページ32cにアクセスすると、オペレーティングシステムのページ障害ハンドラは、RAM12に新しいページ33c(図示しない)を割り当て、I/O操作を実行してブロック34cの内容をページ33cにコピーし、ページテーブルを更新して、仮想アドレス空間31のページ32cをシステムメモリアドレス空間30のページ33cにマップする。ページ32aおよび32bの場合、このプロセスは、図3に示す時点で既に完了している。データページ32d/33dは、アプリケーションにより実行時に生成された内容を保持する。この内容は、I/Oベースデバイス14からロードされたものではない。
図3に示すように、CPU11がI/Oベースデバイス14上に存在するアプリケーションプログラムを実行している時、RAM12のページは、実行しているアプリケーションプログラムのコードを保持する必要がある。しかし、アプリケーションプログラムがメモリアドレス指定デバイス上に存在する場合、その必要はなく、RAM12のより多くのページを他の目的に使用できる(あるいは別法によると、より少ないRAMの全体量で、意図されたタスクを履行することができる)。このプロセスは、一般に「直接実行」と呼ばれる。図4は、仮想アドレス空間31で実行されている図3と同じアプリケーションを示すが、この場合、アプリケーションは、I/Oベースデバイス14ではなくメモリアドレス指定デバイス上に存在し、直接実行されている。図4に示すように、アプリケーションプログラムファイルからのアプリケーションコードは、メモリアドレス指定デバイス13のブロック35a〜cに存在する。メモリアドレス指定デバイス13は、システムメモリアドレス空間30内に存在するため、ブロック35aおよび35bは、それぞれ仮想アドレス空間31のページ32aおよび32bに直接マップされる。同様に、アプリケーションがページ32cにアクセスすると、オペレーティングシステムのページ障害ハンドラは、単に、仮想アドレス空間31のページ32cとシステムメモリアドレス空間30のページ35cとの間の別のマッピングを確立し、オペレーティングシステムは、どのページもRAM12に割り当てる必要はない。一方、データページ32dは、図3に示されたシナリオと同様に、RAM12のページ33dにマップされる点に注目する。
図5は、本発明を具現しない先行技術のオペレーティングシステム40のコンポーネント構造を視覚化する。図3および図4に示すデマンドページングおよび直接実行機能をインプリメントするために必要なコンポーネントのみを図示する。オペレーティングシステム40は、インターフェース48を介したアプリケーションプログラム49から発せられるI/Oベースデバイス14またはメモリアドレス指定デバイス13上に存在するファイルへのアクセス要求を処理するメモリ/ファイルマネジャ41を含む。I/Oベースデバイス14上のファイルにアクセスするために、メモリ/ファイルマネジャ41は、ファイルシステムI/Oインターフェース45を介して、ファイルシステムドライバ43と対話する。オペレーティングシステム40は、複数のバージョンのファイルシステムドライバを含み、各々のファイルシステムドライバは、特定のファイルシステムタイプの処理を担い、すべてのファイルシステムドライバは、同じファイルシステムI/Oインターフェース45をインプリメントする。同様に、オペレーティングシステム40は複数のバージョンのデバイスドライバを含み、各々のデバイスドライバは特定タイプのデバイスの処理を担い、すべてのデバイスドライバは同じデバイスI/Oインターフェース46をインプリメントする。
図5に示すように、オペレーティングシステム40のコンポーネント構造内では、デバイスドライバ44(およびすべてのデバイスドライバ)が担っているのは、データをI/Oベースデバイス上の指定の場所からRAM内に、あるいはこの逆にコピーすることである。デバイスドライバは、デバイスの内容またはこれらの内容が組織化される方法に関する知識は持たない。デバイス上に存在するデータは、一般に、各々が「ブロック数」により識別される「ブロック」と呼ばれる塊状に分割される。デバイスI/Oインターフェース46は、デバイスドライバの要求により、ブロック数Bで識別されるブロックから、アドレスAで開始するRAMのブロックに、あるいはこの逆にデータをコピーできるようにする。
デバイス上にデータを構造化ストレージで格納できるように、オペレーティングシステム40は、ファイルシステムドライバを提供する。ファイルシステムドライバは、「ファイル」の集合としてデバイス上に格納されたデータへのアクセスを可能にし、各々のファイルは、順に並んだバイトのシーケンスの抽象化を提供する。すべてのファイルは、一般に「ファイル名」と呼ばれるファイルシステムにより提供されるいくつかの手段により識別される。ファイルシステムは、各々のファイルのどのバイトが、下のデバイスのどのブロック内に格納されるかというトラックを保持する。この記録保持を実行するのに必要な情報は、通常、「ファイルシステムメタデータ」と呼ばれ、下にあるデバイス上に格納される。ファイルシステムメタデータの特定のレイアウトは、ファイルシステムごとに異なる。図5に示すように、オペレーティングシステム40のコンポーネント構造内では、ファイルシステムメタデータのレイアウトを処理するために必要なすべてのロジックをインプリメントするのは、ファイルシステムドライバ43(およびすべてのファイルシステムドライバ)が担っている。ファイルシステムI/Oインターフェース45は、あるファイル名で識別されるファイルFからデータを、ファイルF内の指定のオフセット0で開始して、アドレスAで開始するRAMのブロック内に、あるいはこの逆にコピーするというファイルシステムドライバの要求を認める。このような要求を処理するため、ファイルシステムドライバは、ファイルシステムメタデータを調査して、下にあるデバイスのどのブロックBが、ファイルF内のオフセット0に対応するデータを保持するかを決定し、下にあるデバイスを処理するデバイスドライバのデバイスI/Oインターフェース46を使用して、前記デバイスとメモリの指定ブロックとの間でコピーを行うかを決定する。
したがって、図5に示すように、オペレーティングシステム40のコンポーネント構造内では、図3に示すデマンドページング機能は以下のようにインプリメントされる:アプリケーションが、システムメモリアドレス空間内で現在使用されていないページにアクセスすると、オペレーティングシステムのページ障害ハンドラ(通常、メモリ/ファイルマネジャ41の一部)は、ページ記述子から、アプリケーションがページ中のどの内容を求めているのか決定する。ページ記述子は、ファイルF、および前記内容が発見されるファイルF内のオフセット0を指定することにより、前記内容を識別する。次に、メモリ/ファイルマネジャ41は、新しいページをRAM12に割り当て、ファイルシステムドライバ43からファイルシステムI/Oインターフェース45を介して、データをファイルF内のオフセット0から前記の新しいページにコピーするように要求する。上記のとおり、ファイルシステムドライバ43は、ファイルシステムメタデータを調査して、下にあるデバイス(この場合、I/Oベースデバイス14)のどのブロックBがデータを保持しているかを決定し、デバイスドライバ44のデバイスI/Oインターフェース46を使用して、そのデータを前記の新しいページにコピーする。I/O操作が完了すると、メモリ/ファイルマネジャ41は、それに応じてページテーブルを更新する。
しかし、先行技術のファイルシステムI/Oインターフェース45は、この目的に適していないため、ファイルシステムドライバ43を使用して、メモリアドレス指定デバイス13上に存在するファイルに対する直接実行アクセスを実行するのは不可能である。その代わりに、図5に示すように、オペレーティングシステム40のコンポーネント構造内では、直接実行アクセスは、メモリ/ファイルマネジャ41内にしっかりと組み込まれているXIPマネジャ42により処理され、メモリアドレス指定デバイス13に直接アクセスする。したがって、XIPマネジャ42は、メモリアドレス指定デバイス13にアクセスし、前記デバイス上に格納されたデータのファイルシステムレイアウトを処理することの両方を担っている。XIPマネジャ42によりサポートされるファイルシステムレイアウト以外のファイルシステムレイアウトを使用して、メモリアドレス指定デバイス13上のデータにアクセスすることは、オペレーティングシステム40が、さもなければ、このようなファイルシステムにファイルシステムドライバを提供すると思われる場合でも不可能である。
本発明は、このような制約を除去する。図6は、本発明を具現するメモリアドレス指定デバイス13に対する直接実行アクセスをインプリメントするオペレーティングシステム50のコンポーネント構造を示す。図5に示す先行技術のオペレーティングシステム40と比べて、オペレーティングシステム50は、コンピュータシステム10のすべてのハードウェアコンポーネント(RAM12、I/Oベースデバイス14、メモリアドレス指定デバイス13)に対して同じインターフェースを保持する。また、オペレーティングシステム50は、アプリケーションプログラム49に対して同じインターフェース48を使用する。メモリ/ファイルマネジャ51は、先行技術(図5参照)により提供される修正バージョンのメモリ/ファイルマネジャ41であり、ファイルシステムドライバ52は、先行技術(図5参照)により提供される修正バージョンのファイルシステムドライバ43である。オペレーティングシステム50は、メモリアドレス指定デバイス13にアクセスするデバイスドライバ53も提供する。オペレーティングシステム40の先行技術のいくつかのバージョンは、同様にメモリアドレス指定デバイス13にアクセスするデバイスドライバも提供していたが、このようなドライバは、デバイスI/Oインターフェース46(図5参照)のみをインプリメントし、したがって、直接実行機能を提供することはできなかった点に注目する。この機能は、XIPマネジャ42によりインプリメントされたが、XIPマネジャ42は、デバイスドライバを使用せずに、メモリアドレス指定デバイス13に直接アクセスする。図6に示すように、本発明は、XIPマネジャのコンポーネントを必要としない。その代わりに、直接実行機能は、この場合、メモリ/ファイルマネジャ51、ファイルシステムドライバ52およびデバイスドライバ53内に組み込まれる。これは、2つの新しいインターフェース:ファイルシステムドライバ52により提供されるファイルシステムのダイレクトアクセスインターフェース54、およびデバイスドライバ53により提供されるデバイスダイレクトアクセスインターフェース55を使用することにより可能である。デバイスダイレクトアクセスインターフェース55の基本的な特徴は、システムメモリアドレス空間内に存在するメモリアドレス指定デバイスのブロックBのシステムメモリアドレスAを検索する手段を提供することである。同様に、ファイルシステムのダイレクトアクセスインターフェース54の基本的な特徴は、ファイルFが、システムメモリアドレス空間内に存在するメモリアドレス指定デバイス上に存在する場合、オフセット0におけるファイルFの内容のシステムメモリアドレスAを検索する手段を提供することである。これらのダイレクトアクセスインターフェースの使用については、以下に詳細に説明する。
図6に示すように、オペレーティングシステム50は、インターフェース48を通してアプリケーションプログラム49と対話する。インターフェース48の一部は、アプリケーションプログラム49によりトリガされるデマンドページング要求から成り、アプリケーションプログラム49は、システムメモリアドレス空間30のページに現在マップされない仮想アドレス空間31のページにアクセスする。(仮想アドレス空間31およびシステムメモリアドレス空間30は、図3および図4に示され、仮想アドレス空間31は、アプリケーション49の仮想アドレス空間に対応する点に注目する。)インターフェース48のその他の部分は、アプリケーションプログラム49によるオペレーティングシステム50に対する要求(「システムコール」)であって、I/Oベースデバイス14またはメモリアドレス指定デバイス13上に存在するファイルの内容を読み取るか、書き込むか、さもなければアクセスするための要求から成る。メモリ/ファイルマネジャ51は、インターフェース48を介したアプリケーションプログラム49による要求を処理するオペレーティングシステム50のコンポーネントである。I/Oベースデバイス14またはメモリアドレス指定デバイス13上に存在するファイルの内容にアクセスするには、メモリ/ファイルマネジャ51は、ファイルシステムI/Oインターフェース45またはファイルシステムのダイレクトアクセスインターフェース54あるいはその両方を介して、ファイルシステムドライバ52と対話する。オペレーティングシステム50は、各々が特定のファイルシステムレイアウトの処理を担う複数のバージョンのファイルシステムドライバを含む。すべてのファイルシステムドライバは同じファイルシステムI/Oインターフェース45をインプリメントし、いくつかのファイルシステムドライバは、さらに、メモリアドレス指定デバイス上に存在するファイルに対する直接実行アクセスを実行するのに適するファイルシステムのダイレクトアクセスインターフェース54をインプリメントする。ファイルシステムドライバ52は、デバイスI/Oインターフェース46またはデバイスダイレクトアクセスインターフェース55あるいはその両方を介して、デバイスドライバ44および53と対話する。オペレーティングシステム50は、各々が特定タイプのデバイスの処理を担う複数バージョンのデバイスドライバも含む。すべてのデバイスドライバは同じデバイスI/Oインターフェース46をインプリメントし、メモリアドレス指定デバイス13のデバイスドライバは、さらに、メモリアドレス指定デバイス13上に存在するファイルに対する直接実行アクセスを実行するのに適するデバイスダイレクトアクセスインターフェース55をインプリメントする。I/Oインターフェース45およびダイレクトアクセスインターフェース54の両方を提供するファイルシステムドライバの場合、メモリ/ファイルマネジャ51は、このようなファイルシステムドライバにより処理されるファイルに対する定期的なアクセスおよび直接実行アクセスの両方を実行すること可能である。図7および図8は、それぞれ定期的なアクセスおよび直接実行アクセスを実行するのに必要な制御フローを詳細に示す。図9は、2つの方法のどちらを特定ファイルのアクセスに使用するかを選択するために必要な決定ロジックを詳細に示す。
図7は、オペレーティングシステム50が、I/Oベースデバイス14上に存在するファイルにアクセスするための要求を処理する時の制御フローを示す。この制御フローは、先行技術のオペレーティングシステム40が対応するアクセスに使用する制御フローと同じである点に注目する。制御フローのステップは、順にアクション60a〜fにより表現される。ここに示す特定のアクションは、アプリケーション49が、仮想アドレス空間31のページ32cにアクセスしようと試みた後、図3に示す状況に対応する。このページは、システムメモリアドレス空間30のどのページにも現在マップされていないため、ページ障害割込みが生成され、オペレーティングシステム50のメモリ/ファイルマネジャ51コンポーネントにより処理される。これは、図7にアクション60aで表現される。メモリ/ファイルマネジャ51は、ページ32cのページ記述子から、アプリケーションが、ページ32cの内容が、オフセット0におけるファイルFの内容に対応するはずであると予想していることを読み取る。メモリ/ファイルマネジャ51は、ファイルFが、ファイルシステムドライバ52により処理されるファイルシステム上に存在すると決定する。メモリ/ファイルマネジャ51は、さらに、ファイルFが直接実行をサポートしないと決定する(この点について、以下で詳細に説明する)。メモリ/ファイルマネジャ51は、次に、RAM13内の自由ページ33cを割り当て、そのシステムメモリアドレスAを決定し、ファイルシステムドライバ52のファイルシステムI/Oインターフェース45を介して、オフセット0におけるファイルFの内容をシステムメモリアドレスAのページにコピーするように要求する(アクション60b)。ファイルシステムドライバ52は、オフセット0におけるファイルFのデータが、I/Oベースデバイス14のブロックB上に存在し、デバイスドライバ44が、I/Oベースデバイス14へのアクセスを担うことを決定する。ファイルシステムドライバ52は、次に、デバイスドライバ44のデバイスI/Oインターフェース46を介して、I/Oベースデバイス14のブロックBをシステムメモリアドレスAのページにコピーするように要求する(アクション60c)。デバイスドライバ44は、I/Oベースデバイス44上のI/O操作61に、そのコピーを実行させる。I/O操作61が完了すると、デバイスドライバ44は、デバイスI/Oインターフェース46を介して、ファイルシステムドライバ52に完了を報告し(アクション60d)、ファイルシステムドライバ52は、同様に、ファイルシステムI/Oインターフェース45を介してメモリ/ファイルマネジャ51に完了を報告する(アクション60e)。メモリ/ファイルマネジャ51は、最後に、システムメモリアドレス空間30におけるページ33cに対する仮想アドレス空間31のページ32cのマッピングを確立する。
図8は、同様に、オペレーティングシステム50が、メモリアドレス指定デバイス13上に存在するファイルに対する直接実行アクセスを実行するという要求を処理する時の制御フローを示す。このフローは、先行技術のオペレーティングシステム40が対応するアクセスに使用するフローとは異なり、本発明により記述される新しいダイレクトアクセスインターフェースを使用する点に注目する。さらに、メモリアドレス指定デバイス13上のファイルに対するいくつかのアクセスは、直接実行アクセスに適さず、この場合、その代わりに、図7に示し、上記で説明した制御フローと等価な制御フローを使用して、ファイルに対する定期的なI/Oアクセスが実行される。これは、デバイスドライバ53が、デバイスドライバ44と同様にデバイスI/Oインターフェース46もインプリメントするために可能である。
図8に示す制御フローのステップは、順にアクション70a〜fで表現される。図8に示す特定のアクションは、アプリケーション49が仮想アドレス空間31のページにアクセスすることを試みた後の図4に示す状況に対応する。図7のように、ページ障害割込みが生成されて、メモリ/ファイルマネジャ51により処理され(アクション70a)、メモリ/ファイルマネジャ51は、やはり、ページ32cのページ記述子から、アプリケーションが、ページ32cの内容がオフセット0におけるファイルFの内容に対応するはずであると予想していることを読み取る。メモリ/ファイルマネジャ51は、ファイルFが、ファイルシステムドライバ52により処理されるファイルシステム上に存在すると決定する。メモリ/ファイルマネジャ51は、さらに、ファイルFが直接実行をサポートしないと決定する(この点について、以下で詳細に説明する)。メモリ/ファイルマネジャ51は、次に、ファイルシステムドライバ52のファイルシステムのダイレクトアクセスインターフェースを介して、オフセット0におけるファイルFの内容のシステムメモリアドレスを検索するように要求する(アクション70b)。ファイルシステムドライバ52は、オフセット0におけるファイルFの内容が、メモリアドレス指定デバイス13のブロックB上に存在し、デバイスドライバ53がメモリアドレス指定デバイス13へのアクセスを担うと決定する。ファイルシステムドライバ52は、次に、デバイスドライバ53のデバイスダイレクトアクセスインターフェース55を介して、メモリアドレス指定デバイス13のブロックBのシステムメモリアドレスを検索するように要求する(アクション70c)。デバイスドライバ53は、メモリアドレス指定デバイス13のブロックBが、システムメモリアドレス空間30のページ35cに対応し、デバイスダイレクトアクセスインターフェース55を介して、そのアドレスAをファイルシステムドライバ52に返し(アクション70d)、同様に、ファイルシステムのダイレクトアクセスインターフェース54を介して、アドレスAをメモリ/ファイルマネジャ51に返す(アクション70e)と決定する。メモリ/ファイルマネジャ51は、最後に、システムメモリアドレス空間30のアドレスAにおけるページ35cに対する仮想アドレス空間31のページ32cのマッピングを確立する。
図9は、ファイルシステムI/Oインターフェースまたはファイルシステムのダイレクトアクセスインターフェースを使用してファイルFにアクセスするかどうかを決定する時のオペレーティングシステム50(図6)内の制御フローを示す。オペレーティングシステムは、最初に、どのファイルシステムドライバが、ファイルFを保持するファイルシステムFSに責任を負うかを決定する。ファイルシステムドライバがファイルシステムのダイレクトアクセスインターフェースを全然サポートしていない場合、ファイルシステムI/Oインターフェースが使用される。さもなければ、オペレーティングシステムは、どのデバイスドライバが、ファイルシステムFSの下にあるデバイスDに責任を負うかを決定する。デバイスドライバが、デバイスダイレクトアクセスインターフェースを全然サポートしていない場合、同様にファイルシステムI/Oインターフェースが使用される。さもなければ、オペレーティングシステムは、ファイルシステムFSが、ファイルFに直接実行アクセスするためにユーザにより構成されたかどうかを決定する。構成された場合は、ファイルシステムのダイレクトアクセスインターフェースが使用され、さもなければ、ファイルシステムI/Oインターフェースが使用される。実施態様によっては、ユーザは、FS上のすべてのファイルに対する直接実行アクセスをできるようにするか、またはFS上のすべてのファイルに対して直接実行アクセスできないようにするかのみ選択する。他の実施態様では、ユーザは、各々の単一ファイルに関して別個に、このような選択を行う。さらに、実施態様によっては、その他の構成可能なファイルシステムパラメータが、ユーザにより、直接実行と互換性のある値に設定された場合にのみ、直接実行アクセスを可能にすることができ、たとえば、ファイルシステムのブロックサイズは、複数のシステムメモリページのサイズに等しい値、または複数のシステムメモリページのサイズに構成する必要がある。
オペレーティングシステムは、必ずしも、ファイルFに1回アクセスするごとに、図9に示す完全な決定ロジックを実行する必要はない点に注目する。その代わりに、選択は、ファイルFが最初にアクセスされ、ファイルFに関連するオペレーティングシステムのデータ構造内に記憶されている時点で選択され、その後のアクセスは、前記データ構造内に格納されている決定結果を再利用する。
図10〜図18は、Linuxオペレーティングシステム内における本発明の一実施態様をさらに詳細に示す。本発明は、インターフェースを拡張することにより、直接実行機能を標準オペレーティングシステムのI/Oコンポーネント構造内に組み込むのであって、コンポーネント構造全体を交換するのではない。Linuxは、I/O操作の実行に関連して、以下のコンポーネント層を提供する:
関連する特定ハードウェアを認識せずに、外部記憶装置にアクセスできるようにするデバイスドライバ層と、
外部記憶装置を認識せずに、ロジックファイルのビューを使用して外部記憶装置にアクセスすることが可能なファイルシステム層と、
アプリケーションが仮想メモリ、およびオペレーティングシステムが使用する動的アドレス変換技術を認識せずに、アプリケーションの実行をできるようにするメモリ管理層。
図10は、多くの現代的なオペレーティングシステムにインプリメントされるデバイスの抽象化を示す。この実施例は、Linuxのデバイスドライバを示す。make_request関数は、データをデバイスに読み書きするための要求を提出するために呼び出される。request_queueおよびdo_request関数は、Linux内部の最適化の一部である。デバイスドライバは、「要求をディスパッチする −> 要求を処理する −> 割り込みハンドラ −> 要求をディスパッチする」のループで動作し、デバイスドライバに提出されたすべての作業が実行される。
デバイスドライバ層は、読み取り要求または書き込み要求を提出できるようにする。この層の頻繁なユーザは、データをファイルから転送するか、またはファイルに転送するファイルシステムのreadpage(s)/writepage(s)動作である。データをアドレス指定するには、物理ブロック数が使用される。
本発明は、図11に示されているデバイスドライバ層のインターフェースに対する拡張を提供する。既存のインターフェースを元の状態に維持しつつ、この拡張は、デバイス上のデータを直接参照するために使用できる機能を提供する。この参照は、要求を提出せずにデバイス上のデータにアクセスし、その完了を待つために使用することができる。この拡張は、任意に、メモリアドレス指定デバイスにアクセスするデバイスドライバによりインプリメントすることが可能である。新しい動作direct_accessは、make_requestに類似する物理ブロック番号を取得するが、どのデータも転送しない。その代わりに、データの参照が返される。この参照は、デバイスが、さらにデバイスドライバ層と対話せずに、再び閉鎖/アンマウントされるまで、何らかのデータをその後いつでも物理ブロックに読み書きするために使用することができる。新しいインターフェースの使用は任意であり、従来のmake_requestインターフェースは、生デバイスドライバなどの新しいインターフェースをサポートしていないユーザのために、元の状態を維持する。従来のインターフェースは汎用ファイルシステムをサポートすることが重要であり、汎用ファイルシステムを使用して、ファイルシステムのメタデータを転送する(inode、directoryエントリなど)。
図12は、Linux内の汎用ファイルシステムが、デバイスドライバのmake_request関数を使用して、どのようにアドレス空間操作をインプリメントするかを示す。read page(s)/write page(s)関数は、get_block関数を使用して[複数のページを処理する場合、繰り返し]、複数の対象ページに関連するデバイス上の物理ブロック数を識別する。図10に示すmake_request関数は、データにアクセスするために使用される。Linuxでは、ファイルシステムは、一般に、ファイルシステムのライブラリ関数と共にアドレス空間操作を使用して、sys_read()およびsys_write()などのファイル操作を実行する。これらのアドレス空間操作およびライブラリ関数の使用は任意だが、殆どの汎用ファイルシステムはこれらを使用する。アドレス空間操作、read page()、read pages()、write page()、write pages()は、データの1つまたは複数のメモリページをデバイスドライバから読み取るか、またはデバイスドライバに書き込むために使用される。メモリページをアドレス指定するには、ロジックファイルハンドルおよびオフセットが使用される。このアドレス指定は、ファイルシステムにより物理ブロック番号に変換される。
本発明は、図13に示すように、あるメモリページの背後で記憶装置の参照を検索できるようにするget_xip_pageという名称の関数により、アドレス空間操作インターフェースに対する拡張を提供する。この機能は、ファイルハンドル、およびアドレス指定用オフセットを使用し、get_block関数を呼び出することにより、ファイルハンドルおよびアドレス指定用オフセットを物理ブロック番号に変換し、その物理ブロックの背後で、デバイスドライバ層のdirect_access関数から記憶装置の参照を検索する(図11に示す)。この参照は、ファイルシステムまたはデバイスドライバ層とさらに対話せずに、ファイルが切り捨てられるか、またはファイルシステムがアンマウントされるまで、何らかのデータをその後いつでも物理ブロックに読み書きするために使用することができる。新しいインターフェースの使用は、サポートされている場合は必須であり、データの完全性の点で、従来のread page(s)/write page(s)インターフェースまたは新しいget_xip_pageインターフェースがファイルに対してサポートされる。
read page(s)/write page(s)関数の主なユーザは、ファイルシステムのライブラリ関数である。図14は、ファイルシステムのライブラリ関数が、Linuxの汎用ファイルシステムのためのread_typeファイル操作をどのように実行するかを示す。
generic_file_read関数は、sys_read()システムコールに関連するファイル操作を実行する。
generic_file_readv関数は、sys_readv()システムコールに関連するファイル操作を実行する。
generic_file_aio_read関数は、非同期IOシステムコールに関連する読み取り操作を実行する。
generic_file_sendfileファイル操作は、sys_sendfile()システムコールに関連するファイル操作を実行する。
これらのすべての関数はgeneric_mapping_readを呼び出し、generic_mapping_readは、read page(s)関数を使用して(図12に示すように)、デバイスから1つまたは複数のページを読み取る。これらの関数の使用は、ファイルシステムの場合は任意だが、汎用ファイルシステムは、独自のファイル操作のインプリメンテーションを行う代わりに、すべての関数を使用する。
図16は、ファイルシステムのライブラリ関数が、どのようにLinuxの汎用ファイルシステムのためのwrite typeファイル操作を実行するかを示す。
generic_file_write関数は、sys_write()システムコールに関連するファイル操作を実行する。
generic_file_writev関数は、sys_writev()システムコールに関連するファイル操作を実行する。
generic_file_aio_write関数は、非同期IOシステムコールに関連する書き込み操作を実行する。
これらのすべての関数は、generic_file_direct_write(オプションのO_DIRECTを使用して、対象ファイルを開く場合)、またはgeneric_file_buffered_writeを呼び出す。これらの関数はwrite page(s)関数を使用して、1つまたは複数のページをデバイスに書き込む。
本発明は、ライブラリ関数が、get_xip_pageインターフェースがサポートされている場合、それを使用できるようにするために、ライブラリ関数の拡張を提供する。図15は、read type操作のために、ファイルシステムのライブラリ関数に対して行われる拡張を示す。get_xip_pageアドレス空間操作が存在するかどうかに応じて、操作を実行するために、generic_mapping_read関数、または新しいdo_xip_mapping_read関数を使用して、操作が実行される。do_xip_mapping_read関数は、get_xip_pageアドレス空間操作を使用して、デバイス上の対象データの参照を検索する。データ転送の場合、この参照が直接使用され、I/O操作を実行する必要はない。図17は、write type操作のために、ファイルシステムライブラリ関数に対して行われる拡張を示す。get_xip_pageアドレス空間操作が存在するかどうかに応じて、generic_file_buffered_write/generic_file_buffered_write関数を使用するか、または新しいgeneric_file_xip_write関数を使用して操作を行う。generic_file_xip_write関数は、get_xip_pageアドレス空間操作を使用して、デバイス上の対象データに対する参照を検索する。データ転送の場合、この参照を直接使用して、I/O操作を実行する必要はない。
get_xip_pageアドレス空間操作をインプリメントするすべてのファイルシステムは、ライブラリ関数によりインプリメントされるすべてのファイル操作を使って、直接実行アクセスを実行するために、さらにコードを変更する必要はない。図15、図17および図18は、拡張されたライブラリ関数が、get_xip_pageアドレス空間操作がインプリメントされるかどうかに応じて、それぞれの機能をどのようにインプリメントするかを示す。get_xip_pageがインプリメントされる場合、すべてのライブラリ関数は、get_xip_pageから検索された参照を使用して、記憶装置に対するすべてのデータ転送を直接実行する。図18は、ファイルメモリマッピングのために、ファイルシステムのライブラリ関数に対して行われる拡張を示す。このアプリケーションは、現在存在しない仮想メモリアドレス空間の一部にアクセスした。Linuxの標準のアーキテクチャ依存およびコアメモリ管理機能は、結果として得られるページ障害を処理するために使用される。定期的な処理と違って、ファイルシステムは、対象ページに関連するファイルのために、filemap_xip_nopageハンドラをインストールした。このハンドラは、get_xip_pageを使用して、デバイス上の対象データの参照を検索する。この参照はdo_no_page関数に返され、アプリケーションの仮想アドレス空間ページテーブル内にページテーブルエントリを生成し、アプリケーションが、オペレーティングシステムがさらに関与せずに、デバイス上のデータを直接使用できるようにする。ページテーブルのエントリは、ファイルマッピングがプライベートであることが選択された場合(標準機構が適用される)、後に、書き込み機構上のコピーの対象になる。
直接実行の効果は、アプリケーションのバイナリファイルおよび共有ライブラリが、Linuxのファイルマッピングの対象になり、その結果、上記のページ障害機構の対象になるため達成される。
上記の拡張は、LinuxオペレーティングシステムのI/O関連コンポーネント内で、全体の構造および層隔離を元の状態に維持する。デバイスドライバ層は、物理ブロック番号をデバイスにマップするが、ファイルまたはその他のロジックオブジェクトと連動しない。ファイルシステムは、ロジックファイルと物理ブロック番号のアドレス指定との間でマッピングを実行するが、デバイスの構造と連動しない。一方、データ転送自体は、上下逆転する。デバイスドライバは、新たな拡張を使用する場合、データを転送しない。データは、ファイル操作ライブラリ関数で直接背転送される。この解決方法の効果は、デバイスドライバ層および汎用ファイルシステムに対して、非常に小さくかつ非侵入的な変化のみを含むことである。汎用ファイルシステムは、メモリ消費量の減少および実行の増加など、直接機構の利点を容易に取得することができる。