web-dev-qa-db-ja.com

仮想アドレスを物理アドレスに変換します

次のページテーブルは、16ビットの仮想アドレスと物理アドレス、および4,096バイトのページを持つシステム用です。参照ビットは、ページが参照されると1に設定されます。定期的に、スレッドは参照ビットのすべての値をゼロにします。すべての数値は10進数で提供されます。 enter image description here

次の仮想アドレス(16進数)を同等の物理アドレスに変換したい。また、ページテーブルの適切なエントリに参照ビットを設定したい。

0xE12C

0x3A9D

0xA9D9

0x7001

0xACA1

私は答えは知っていますが、これらの答えをどのように達成できるか知りたいです:

0xE12C → 0x312C
0x3A9D → 0xAA9D
0xA9D9 → 0x59D9
0x7001 → 0xF001
0xACA1 → 0x5CA1

これ を見つけて試しましたが、あまり役に立ちませんでした。

13
Ruan

仮想アドレスは16ビット長であることが前提です。
したがって、仮想アドレス空間には2 ^ 16個のアドレスがあります。
ページサイズは4 KB(ページ内に4K(4 *(2 ^ 10))アドレスがある)であるため、ページ数は(2 ^ 16)/(2 ^ 12) = 2 ^ 4。
各ページをアドレス指定するには、4ビットが必要です。
仮想アドレスの最上位4ビットは参照されるページ番号を示し、残りの12ビットはページオフセットになります。

覚えておくべきことの1つは、(仮想アドレス空間内の)ページサイズが常にメインメモリのフレームサイズと同じであることです。したがって、物理アドレスでは、最後の12ビットは仮想アドレスと同じままです。

メインメモリのフレームアドレスを取得するには、最初の4ビットを使用します。
例:仮想アドレス0xACA1を考えます
Aの[〜#〜] a [〜#〜] CA1はページ番号(10)を表し、対応するフレーム番号は5(0101)であるため、結果の物理アドレスは→0x5CA1。

14
Akash Mahapatra

virtualアドレスをphysicalアドレスに変換するには(apply[〜#〜] only [〜#〜]この宿題の質問に)、知る必要があります2もの:

  • ページサイズ
  • 仮想アドレスのビット数

この例では、16ビットシステム4KBページサイズおよび物理メモリサイズ64KBです。

まず、ページ内のオフセットとして機能するために必要なビット数を決定する必要があります。
log2(Page-Size) = log2(4096) =12bits foroffset

仮想アドレスの16ビットのうち、12はオフセット用です。つまり、各プロセスには2^4 = 16仮想ページ。ページテーブルの各エントリには、ページに対応する対応するフレームが格納されます。例えば:

enter image description here

さあ、翻訳しましょう!

まず、作業を簡単にするために、0xE12Cからbinaryへ。

0xE12C = (1110 0001 0010 1100) in base 2
1110 = 14 in decimal
Entry 14 in P.T => Page frame 3.

12オフセットビットに連結させます

Answer: (0011 0001 0010 1100) = 0x312C

もう一つの例: 0x3A9D

0x3A9D = 0011 1010 1001 1101
0011 = 3
PageTable[3] = 10
10 in decimal = 1010 in binary
1010 1010 1001 1101 in binary = 0xAA9D
13
Tony Tannous

この問題を解決するために、詳細を正しく把握する必要があります。

  1. 16ビットの仮想アドレス空間= 2 ^ 16 = 65,536アドレス空間
  2. 16ビットの物理アドレス空間= 2 ^ 16 = 65,536アドレス空間
  3. 4096バイトのページサイズがオフセットを決定します。オフセットはLog(4096)/ Log(2)= 12ビットです。つまり、ページサイズは2 ^ 12
  4. @Akash Mahapatraによると、仮想アドレスからのオフセットは、物理アドレスへのオフセットに直接マッピングされます

そのため、次のものがあります。

  • 仮想アドレスの場合は2 ^ 16(16ビット)-ページの場合はオフセット= 4ビットの2 ^ 12(12ビット)、または使用可能なページの総数。
  • 物理的な計算は同じ数字なので繰り返しはしません。
  • ページの2 ^ 4(4ビット)= 16は、上記のテーブルエントリの数に相関します!

私たちはそこに着いています...我慢してください! :)

16進表記のメモリアドレス0xE12Cは、16ビットのアドレスを保持していることも知られています。 (質問に記載されているため。)

今すぐ住所を肉食しましょう...

最初に情報から「0x」を削除します。

E12Cを@Tony Tannousのようなバイナリ表記に変換できますが、少しショートカットを適用します。

Mapping of the Address and Offset

私は単に比率を使用します。さて、アドレスは上記の4文字で表記され、16/4 = 4なので、最初の文字を仮想アドレスとして定義できますが、他の3文字はオフセットアドレスです。

16進形式の 'E'の情報を使用して、10進= 14に変換する必要があります。次に、提供されたテーブルを見て、ページフレーム '3'を見つけました。ページフレーム3は10進形式で記載されていますが、16進形式に戻す必要があります... Duh!... 3!

そのため、0xE12Cの仮想メモリロケーションの物理アドレスマッピングは、物理メモリの0x312Cにあります。

次にテーブルに戻り、参照ビット列を参照して、行14に「1」を入力します。

これらに同じ概念を適用します-

0x3A9D → 0xAA9D
0xA9D9 → 0x59D9
0x7001 → 0xF001
0xACA1 → 0x5CA1

気付いた場合、最後の3桁は同じです(オフセットを決定します)。そして、4桁の最初の数字は表に従ってマッピングされます:

table entry 3 -> page frame 10 -> hex notation A
table entry A (10) -> page frame 5 -> hex notation 5
table entry 7 -> page frame 15 -> hex notation F
table entry A (10) -> page frame 5 -> hex notation 5

この説明があなたや私のような人々の助けになることを願っています! :)

2
joke