13

通常のページテーブルがあるとしましょう:

ページ テーブル (ページ サイズ = 4k)

      Page #:  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15          
Page Frame #:  3  x  1  x  0  x  2  x  5  x   7   4   6   x   x   x

51996 のような任意の論理アドレスを物理メモリ アドレスに変換するにはどうすればよいですか?


対数底 2 (4096) を取ると、12 になります。これは、アドレスのオフセットに使用するビット数だと思います。

よくわかりません。51996 / 4096 = 12.69。これは、特定のオフセットで page#12 にあるということですか?

それを「51996」の物理アドレスに変換するにはどうすればよいですか?

4

5 に答える 5

21

特定のメモリ アドレスのページを決定するには、(N ビットの) 最初の P ビットを取得します。

P = lg2(numberOfPages)
あなたの例では、 P=lg2(16)=4

したがって、特定のメモリ アドレスの最初の 4 ビットがページを示します。つまり、残りはそのページの先頭からのオフセットでなければなりません。

あなたの例のアドレス 51996 は、バイナリで 1100101100011100 です。すなわち [1100:101100011100]。

1100 (10 進数で 12) はページ番号
です 101100011100 (10 進数で 2844) はオフセットです

ここで、ページ 12 がメモリ内のどこにあるかを見つける必要があります。
フレーム テーブルを見ると、12 ページが 6 番目のフレームにあるように見えます。すべてのメモリがページング可能なシステム (つまり、メモリにマップされた IO がない) では、6 番目のページ フレームは(entriesPerPage*frameNum)-1になります。

この場合、4000*6-1 = 23999 (メモリのインデックスが 0 であるため、「-1」が必要です。)

この場合、4096 *6-1 = 24575 (メモリのインデックスが 0 であるため、「-1」が必要です。)

あとは、オフセットを追加するだけで、物理メモリ アドレスが得られます。

23999 + 2844=26843 = 0x68DB

24575 + 2844 = 27419 = 0x6B1B

終わり!

これ(編集)が役に立てば幸いです XD

編集:私の間違いを見つけてくれたJelに感謝します:)私の他の間違いを見つけてくれたuser8に感謝します! (pageNum ではなく frameNum)。

于 2009-05-06T21:04:06.507 に答える
1

これは役立つかもしれません:

    import java.util.Arrays;
    import java.util.Scanner;

    public class Run {

        private static Scanner input = new Scanner(System.in);

        public static void main(String[] args) {

            System.out.println("////////// COMMANDS //////////");
            System.out.println("Snapshot: S(enter)r, S(enter)m, S(enter)x, S(enter)p, S(enter)d, S(enter)c");
            System.out.println("time: t");
            System.out.println("Terminate: T#");
            System.out.println("Kill: K#");
            System.out.println("Start process: A");
            System.out.println("Quit program: quit");
            System.out.println("Deletes device: delete");
            System.out.println ("//////////////////////////////");
            OS myComputer;
            int hdd, cdd, printer, cpu, mem, page;
            hdd = cdd = printer = cpu = 20;
            mem = 1;
            page = 1;
            System.out.println("");
            System.out.println("|||| SYS GEN ||||");
            System.out.println("");
            mem = 0;
            System.out.println("Number of Hard-Drives:");
            while (hdd > 10) {
                String inpt = input.next();
                while (Asset.isInt(inpt) == false)
                    inpt = input.next();
                hdd = Integer.parseInt(inpt);
                if (hdd > 10)
                    System.out.println("Try something smaller (less than 10)");

            }

            System.out.println("Number of CD-Drives: ");
            while (cdd > 10) {
                String inpt = input.next();
                while (Asset.isInt(inpt) == false)
                    inpt = input.next();
                cdd = Integer.parseInt(inpt);
                if (cdd > 10)
                    System.out.println("Try something smaller (less than 10)");
            }

            System.out.println("Number of Printers:");
            while (printer > 10) {
                String inpt = input.next();
                while (Asset.isInt(inpt) == false)
                    inpt = input.next();
                printer = Integer.parseInt(inpt);
                if (printer > 10)
                    System.out.println("Try something smaller (less than 10)");
            }

            System.out.println("Amount of Memory:");
            while (mem <= 0) {
                String inpt = input.next();
                if (Asset.isInt(inpt))
                    mem = Integer.parseInt(inpt);
                if (mem<=0)
                    System.out.println("The memory size must be greater than zero.");
                else
                    break;
            }

            Integer[] factors = Asset.factors(mem);
            System.out.println("Enter a page size: "+Arrays.toString(factors));
            while (true) {
                String inpt = input.next();
                while (Asset.isInt(inpt) == false)
                    inpt = input.next();
                if (Asset.inArray(factors, Integer.parseInt(inpt))) {
                    page = Integer.parseInt(inpt);
                    break;
                } else {
                    System.out.println("Page size must be one of these -> "+Arrays.toString(factors));
                }
            }

            System.out.println("Number of CPUs (max10):");
            while (cpu > 10) {
                String inpt = input.next();
                while (Asset.isInt(inpt) == false)
                    inpt = input.next();
                cpu = Integer.parseInt(inpt);
                if (cpu > 10)
                    System.out.println("Try something smaller (less than 10)");
            }
            myComputer = new OS(cpu, hdd, cdd, printer, mem, page);
            myComputer.Running();
        }

    }
于 2012-05-10T19:36:43.690 に答える
1

私があなたの質問を正しく理解していれば (おそらく理解していないでしょう)、ページ テーブル構造を使用して仮想アドレスから物理アドレスを見つける方法を知りたがっています。その場合は、自分が処理者であると想定してください。アドレスの最上位 10 ビットを使用して、ページ ディレクトリ (トップ レベルのページ テーブル) 内のページ テーブルを見つけます。次の 10 ビットは、ページ テーブル (下位レベルのページ テーブル) へのインデックスです。そのページ テーブル エントリのアドレスを使用して、物理ページ アドレスを見つけます。最後の 10 ビットは、ページへのバイト アドレスです。

ちなみに、 OSDevなどの OS 向けのサイトでは、この種の質問を理解してくれる人がもっとたくさんいるでしょう。この種のことを何年も行っていないため、この回答で詳しく説明することはできませんでした。

于 2009-05-06T20:31:38.470 に答える
1

最初のステップ: 51996 / 4000 = 12 -> p 、remain= 3996 -> d (オフセット)。

ここで、表 p(12) = 6 を見てください。

2 番目のステップ: (6*4000) + 3996 : 27996

物理アドレスは 27996 です。

于 2015-05-30T10:22:38.450 に答える
0

次のページ テーブルは、16 ビットの仮想アドレスと物理アドレスを持ち、4,096 バイトのページを持つシステム用です。ページが参照されると、参照ビットが 1 にセットされます。定期的に、スレッドは参照ビットのすべての値をゼロにします。ページ フレームのダッシュは、そのページがメモリ内にないことを示します。ページ置換アルゴリズムはローカライズされた LRU であり、すべての数値は 10 進数で提供されます。

ページ ページ フレーム参照ビット 0 9 0 1 1 0 2 14 0 3 10 0 4 - 0 5 13 0 6 8 0 7 15 0 8 0 0 9 - 0 10 5 0 11 4 0 12 - 0 13 3 0 14 - 0 15 2 0 a. 次の仮想アドレス (16 進数) を同等の物理アドレスに変換します (16 進数と 10 進数で答えてください)。また、ページ テーブル内の適切なエントリの参照ビットを設定します。(3) イ.0xBC2C ii. 0x00ED iii. 0xEA14 iv。0x6901 v。0x23A1 vi。0xA999

于 2014-03-04T11:39:44.467 に答える