2017.3.24
 

その7:IBM i のウンチクを語ろう ~ 単一レベル記憶-4 ~

皆さん、こんにちは。これでもか、とばかりに今回のテーマも単一レベル記憶ですが、ようやくこのテーマの最終回を迎えます。メモリとディスクの全記憶域を単一のメモリ空間と見なす仕組み、と表面的には一言で片付けることもできるこの技術について、背景も含めてきちんと理解しようとすると意外に奥深い、と感じていただけたのではないでしょうか。筆者がしつこいのも事実かもしれませんが。そして今回は、このテクノロジーの課題と、IBM i において実装されている解決策および応用技術について検討してみます。

単一レベル記憶がパフォーマンスにおいて優れているのは、全てのプログラムの稼働環境が単一の仮想アドレス空間内に共存するが故であることは、これまでに述べてきたとおりです。一方で同じ理由により、このまま単純に実装するとセキュリティ上脆弱になってしまうリスクも生じます。そこでIBM i においてはさらに一工夫することで、この矛盾を解決しています。

さてIBM i 上のプログラムは稼動する際に、各種のデータや他のプログラム、言い換えると仮想アドレス空間内の様々なファイル(IBM i 用語ではオブジェクト)にアクセスします。OSよりも上位に位置するアプリケーションにおいては、ライブラリ名とオブジェクト名とを指定することでアクセス対象を指定します。一方でOSの下位に位置するマイクロコード相当のSLICにおいては、対象となるオブジェクトがストアされているアドレスを特定し、その値を保持するポインタと呼ばれる変数を生成・経由することで、実際のアクセスを行います。オブジェクトへのアクセスは、直接ではなく、必ずポインタを経由した間接的なものである、ということです。そしてポインタの生成、さらには更新・破棄などの作業は、SLICが請け負います。

もしここでアプリケーション・プログラムが、任意のアドレスを保持するポインタを自在に生成できてしまったら、何が起こるでしょうか。これは悪意をもって、もしくはついうっかりと、自分の領分を越えて他人のプログラムやデータに、自在にアクセスできることを意味します。他のシステムにおいてはジョブ環境毎にメモリ空間が確保されるので、それぞれのメモリ空間のアドレスは同一、言い換えると他人のジョブ環境は「異次元」に存在しています。これでは仮に自在にポインタを生成できたとしても、他人の領域に直接アクセスすることはできません。一方の単一レベル記憶では、これら全てが同一次元にあるのです。

基幹業務を担うサーバーとして、この状況を看過することはできません。ポインタの生成や変更はSLICというセキュリティ面で信頼できる機能のみに許されるべき仕事であって、作成者不詳のプログラムがシステムに紛れ込み、勝手にポインタを生成することになったら、セキュリティを維持する事は不可能です。

IBM i コラム挿絵1

そこでIBM i においては、「由緒正しく」SLICに作業を依頼して生成されたポインタのみが有効であり、それ以外のあらゆるケースにおいて生成されたポインタは、何らかの不正なプロセスがあったとしてすべて無効扱いされます。ポインタには、常にこの有効・無効を識別するための付加的情報が伴っており、荷物に付いたタグのようなものであることから、タグ・ビットと呼ばれています。オブジェクトにアクセスする際には、仮想アドレス空間内における在処を示すポインタだけでなく、その有効性を判断するためにタグ・ビットも参照されなければなりません。そしてIBM i を稼動させるプロセッサには、タグ・ビットを効率良く参照するための、特殊なレジスターと命令セットが備わっています。

話が脇にそれますが、IBM i がXeonプロセッサ上で稼動する可能性はありますか、という質問をいただいたことがあります。Xeonはこのタグ・ビットを処理する仕組みを備えていないので、少なくとも現状のままでは技術的に不可能でしょう、と答えることにしています。
また、かつてのAS/400は1995年に、それまでの48ビットCISCプロセッサから、PowerPCから派生した、PowerPC ASと呼ばれる新たな64ビットRISCプロセッサに移行しました。当時の新プロセッサが処理するべきデータは現在同様64ビット長でしたが、同時にタグ・ビットを参照する仕組みが追加されていたので、正確な表現ではないと思うのですが、俗に65ビット・プロセッサとも言われていました。オリジナルのPowerPCはタグ・ビット参照機能なし、PowerPC ASはタグ・ビット参照機能あり、だったわけです。

さて、単一レベル記憶の仮想アドレス空間は極めて広大ですので、異種のアプリケーション実行環境を内部に包含する余力があります。これはIBM i の無償オプションとして提供されている、AIXアプリケーション実行環境として実現されています。PASE(Portable Application Solutions Environment)と呼ばれるテクノロジーです。直訳するならば「可搬性のあるアプリケーション・ソリューション環境」といったところでしょうか。当初はAIX用アプリケーション・パッケージを早期にIBM i 上で稼動させるために考えられた仕組であり、実際にいくつかのAIX由来のパッケージはPASEを活用して稼動します。さらに現在では各種機能に加えて、Java、PHP、Pythonなどのオープンソース言語が稼動する、IBM i にとって無くてはならないテクノロジーとなっています。

IBM iとAIXとは稼動するプロセッサが共通ですので、IBM i 上でAIXアプリケーションを稼動させようという試みがあったとしても、不思議なことではありません。課題はメモリ管理です。AIXアプリケーションは単一レベル記憶を必要としません。そこで理論上2128バイトの大きさを持つ仮想アドレス空間の一部に区画を設けて、AIX環境用に240バイト、すなわち1テラ・バイトの専用空間を設けます。そしてこのような空間を最大220個、すなわち約100万個確保することができます。PASEは当初Private Address Space Environment、直訳すると「局所的なアドレス空間環境」と呼ばれていた事があるのですが、こちらの方が名は体を表しているような気がします。プロセッサは通常時はタグ・ビットを参照するモードで稼動しますが、PASEにその制御が移るとタグ・ビットを参照しないモードに切り替わります。そもそもAIXアプリケーションはタグ・ビットを必要としないためです。このような工夫により、IBM i はごく自然に各種のテクノロジーを内部に取り込み、進化することに成功しています。使う側はこのような複雑さを全く意識せずに済んでいますね。

今回でアーキテクチャーの話はおしまいです。少々テクニカルな話題が続きました。これまではIBM i を言わば内側から見てきたわけですが、次回からはIBM i を知らない立場からこのシステムはどう見えるだろうか、といった視点から眺めてみようと思います。

ページトップ

ボタン