トップページ

MONAにおけるメモリ管理

ここではMONAがどのようにしてメモリを管理しているのかを解説していきます。 その前にMONAが動作するIA-32系列のプロセッサがどのようにして メモリを管理するのかを説明します。

IA-32におけるメモリ管理

IA-32系列のプロセッサがどのようにしてメモリにアクセスしているのかを 見てみます。

まずここでIA-32プロセッサがどのようにしてメモリを管理しているかを 説明します。初めにIA-32ではメモリアドレスを表す言葉がたくさん出てきます。 実はIA-32ではRAM上のひとつのメモリアドレスを得るために段階的なアドレス変換を 行っており、それぞれの段階に応じたアドレスの表現があるわけです。次に挙げるのは全て メモリアドレスを表す言葉です。 なお、通常プログラムやアセンブリコードで扱うことができるアドレスは オフセットと呼ばれるアドレスです。 オフセットを論理アドレスに変換し、論理アドレスからRAM上のアドレスである 物理アドレスに変換します。

つぎに、それぞれのアドレスの意味を説明します。

論理アドレス

0-4GB(普通はこれくらいの大きさ)のメモリ空間です。このアドレス自体 かなり抽象的ですが、初めにアドレス空間を認めてしまえば後々の理解が楽になります。

物理アドレス

このアドレスはRAMにアクセスするためのアドレスです。最終的にはこのアドレスの値を 使用してRAMにアクセスします。ページング機構が働いているのであれば 論理アドレスから物理アドレスへされ、物理アドレスを得ることが出来ます。 ページング機構が働いていないのであれば論理アドレスの値がそのまま物理アドレスの 値になります。

セグメント

論理アドレス空間を連続した小さな領域に分けたものです。つまり、多数のセグメントが 集まって論理アドレス空間を為しているといえます。セグメントは連続領域なので

の2つの量で管理できます。

オフセット

あるセグメント内にある論理アドレスのセグメント開始アドレスからの相対値です。 つまり、

オフセット + セグメント開始アドレス = 論理アドレス

となっています。この式からわかるようにセグメントの開始論理アドレスが0x00000000 ならば

オフセット = 論理アドレス

となります。これはMONAにおいて成り立っていることなのでよく覚えて置いてください。

注意:

プログラムで使用するポインタやアセンブリコードで使用できるアドレスは 全てオフセットです。 CPUがオフセットを論理アドレス、物理アドレスに変換することでプログラムが 物理メモリ上のデータを取り扱うことが出来ます。

これまでの関係をまとめると次のような図になります。。

トップページ

MONAにおけるメモリ管理

MONAがIA-32プロセッサ上で動く以上、上で述べたようなメモリ管理が行われています。 初めにセグメントがどのように確保されており、そしてどのようにページングが使用 されているかを説明します。

セグメント

まず、セグメントですがOS,ユーザーアプリケーションを含めて 次の7つのセグメントが定義されています。

初めの6つのセグメントは全て開始アドレスが0, 大きさが4GBのセグメントです。 ということは、 プログラムやアセンブリコードで使われるポインタやアドレスが そのまま論理アドレスとなっており、 どのアドレスにアクセスしてもセグメント の境界を超えるということはありません。 したがって、セグメントに関係するアクセス違反でCPUが止まる (こういうのを一般保護例外を飛ばしたという)ことはなく、セグメントは 確保してあるが管理はしていないということになります。このようなセグメントの取り方を フラットなモデルといい、Linuxでもこのようなセグメントの取り方をしています。

このままではカーネルのデータとユーザーのデータが混ざってしまいます。さらに、 あるプロセスが他のプロセスのデータを改竄してしまうことへの対処が出来ていません。 しかしこの問題は後に述べるページングによって解決され、相互の領域に直接アクセス 出来ないように管理されています。なお、このページングによって各プロセスごとに 独立したメモリ空間を持たせることが出来ます。

最後のタスクステートセグメントは一連の処理内容を管理することが出来ます。 このセグメントを用いることによりマルチタスクが実現できますがMONAでは この機能を用いておらず、自前でマルチタスクを実現しています。

ページング

ページングとはそもそも論理アドレスを物理アドレスに変換するための機構です。 論理アドレスと物理アドレスへの対応は変換表なるページテーブルという領域で 記述されており、ページテーブルはページエントリと呼ばれるデータの配列に なっています。ページエントリはどの論理アドレスがどの物理アドレスに対応するかを 示しており、他に次のような情報を持っています。

ページング機構を用いることによりプロセスがどの論理アドレスにアクセスできるのかを 細かく制御できます。また、論理アドレス空間と物理アドレス空間とを1対1に対応付ける ことが出来るので、ページテーブルをプロセスごとに持たせてやれば 各プロセスごとに独立したメモリ空間(論理アドレス空間)を提供できます。

プロセスが論理アドレス空間をどのように使用しているかは大体決まっていて おおよそ次のようになっています。

カーネルプロセス用

カーネルプロセスのメモリ空間のうち初めの64MBは物理メモリに直接 つながっています。ちなみにカーネルが用いるデータは初めの8MBまでと なっています。

ユーザープロセス用

ユーザープロセスが使用するデータは0xC0000000からとなっています。 メモリアドレスは0xFFFFFFFFまでなのでデータとして利用できる量は0x40000000バイト、 つまり1GBまでです。Photoshopじゃない限りこんなに使わないね。

また、プログラムコードは0xA0000000からとなっています。すなわちプログラムコード の大きさが0x40000000バイトを超えてしまうとデータ領域とぶつかってしまい プロセスが実行できなくなってしまうことになります。 ・・・こんなにでかいプログラムは果たして存在するのだろうか。

最後にメモリ空間の初めの8MBがカーネル用として物理メモリに直結している。 このことはユーザープロセスがカーネルモードで動いたときにカーネルのメモリデータに アクセスできるということを表しています。しかし、ユーザープロセスがカーネルモードで 動くことがあるのだろうか?(あるんだなそんな状況が( ̄ー ̄)。自分で考えてみよう)

トップページ
inserted by FC2 system