Bagaimana saya bisa menggunakan tabel halaman untuk mengubah alamat virtual menjadi alamat fisik?

Katakanlah saya memiliki tabel halaman normal:

Tabel Halaman (Ukuran halaman = 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

Bagaimana cara mengubah alamat logis sembarang seperti 51996 menjadi alamat memori fisik?


Jika saya mengambil basis log 2 (4096), saya mendapatkan 12. Saya pikir ini adalah berapa banyak bit yang harus saya gunakan untuk offset alamat saya.

Aku hanya tidak yakin. 51996/4096 = 12,69. Jadi apakah ini berarti ia terletak di halaman#12 dengan offset tertentu?

Lalu bagaimana cara mengubahnya menjadi alamat fisik "51996"?


person Community    schedule 06.05.2009    source sumber


Jawaban (5)


Untuk menentukan halaman alamat memori tertentu, ambil nomor P bit pertama (dari N bit).

P = lg2(numberOfPages)
Dalam contoh Anda, P=lg2(16)=4

Jadi 4 bit pertama dari alamat memori tertentu akan memberi tahu kita halamannya. Itu berarti sisanya harus diimbangi dari awal halaman tersebut.

Alamat contoh Anda, 51996, adalah 1100101100011100 dalam biner. Yaitu. [1100:101100011100].

1100 (12 dalam desimal) adalah nomor halaman
101100011100 (2844 dalam desimal) adalah offset

Sekarang kita perlu menemukan di mana halaman 12 berada di memori.
Melihat tabel frame Anda, tampaknya halaman 12 berada di frame ke-6. Dalam sistem di mana semua memori dapat di-page (yaitu tidak ada IO yang dipetakan memori), frame halaman ke-6 akan berada di (entriesPerPage*frameNum)-1

Dalam hal ini, 4000*6-1 = 23999 ("-1" diperlukan karena memori diindeks 0.)

Dalam hal ini, 4096*6-1 = 24575 ("-1" diperlukan karena memori diindeks 0.)

Sekarang yang harus kita lakukan adalah menambahkan offset dan kita memiliki alamat memori fisik:

23999 + 2844=26843 = 0x68DB

24575 + 2844 = 27419 = 0x6B1B

Selesai!

Semoga ini (edit) bermanfaat XD

Sunting: Terima kasih kepada Jel karena telah mengetahui kesalahan saya :) Terima kasih kepada pengguna8 karena telah mengetahui kesalahan saya yang lain! (frameNum bukannya pageNum).

person ParoXoN    schedule 06.05.2009
comment
Apakah jawaban Anda berarti bahwa alamat virtual memiliki panjang variabel untuk proses yang berbeda? Misalnya, jika ada dua proses, satu memiliki 16 halaman, dan yang lainnya hanya memiliki 1 halaman, maka bit yang digunakan untuk menunjukkan nomor halaman akan berbeda, sehingga panjang akhir alamat virtual akan berbeda. - person cheng; 14.03.2011
comment
@cheng: Alamat memiliki panjang yang tetap di seluruh proses, jadi jika suatu proses hanya memiliki satu halaman, semua alamatnya akan dimulai dengan nilai yang sama. Pada contoh di atas dengan 16 halaman, empat bit pertama dari satu halaman proses akan menjadi 0b0000. - person ParoXoN; 16.04.2015
comment
Mengapa Anda mengalikan dengan 4000, bukan 4096 pada langkah kedua hingga terakhir? - person Jel; 25.11.2015
comment
@Jel: Tangkapan bagus! Seharusnya 4096. Saya menduga ketika saya pertama kali membaca pertanyaan, saya berasumsi 4k===4000, meskipun pertanyaan tersebut dengan jelas menyebutkan 4096 lebih dari sekali. Terima kasih! - person ParoXoN; 27.11.2015
comment
dalam rumus Anda (entriesPerPage*pageNum)-1 pageNum seharusnya frameNum - person Dimitar; 14.01.2016

Jika saya memahami pertanyaan Anda dengan benar (mungkin tidak), Anda ingin tahu cara menemukan alamat fisik dari alamat virtual menggunakan struktur tabel halaman. Dalam hal ini, anggaplah Anda adalah prosesornya. Gunakan 10 bit paling signifikan dari alamat untuk menemukan tabel halaman di direktori halaman (tabel halaman tingkat atas). 10 bit berikutnya adalah indeks ke dalam tabel halaman (tabel halaman tingkat bawah). Gunakan alamat dalam entri tabel halaman tersebut untuk menemukan alamat halaman fisik. Sepuluh bit terakhir adalah byte alamat ke dalam halaman.

Ngomong-ngomong, Anda mungkin akan menemukan lebih banyak orang yang memahami jenis pertanyaan ini di situs berorientasi OS seperti OSDev. Saya tidak bisa menjelaskan secara rinci jawaban ini karena saya sudah bertahun-tahun tidak melakukan hal semacam ini.

person Zifre    schedule 06.05.2009

Ini mungkin bisa membantu:

    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();
        }

    }
person oscar    schedule 10.05.2012
comment
itu di java tetapi itu akan membantu - person oscar; 10.05.2012

langkah pertama : 51996 / 4000 = 12 -> p , sisa= 3996 -> d (offset).

sekarang lihat tabel p(12) = 6

langkah kedua : (6*4000) + 3996 : 27996

alamat fisiknya adalah 27996.

person tea-addict    schedule 30.05.2015

Tabel halaman berikut adalah untuk sistem dengan alamat virtual dan fisik 16-bit dan dengan halaman 4.096 byte. Bit referensi disetel ke 1 ketika halaman telah direferensikan. Secara berkala, sebuah thread menghilangkan semua nilai bit referensi. Tanda hubung untuk bingkai halaman menunjukkan halaman tersebut tidak ada di memori. Algoritme penggantian halaman dilokalkan LRU, dan semua angka diberikan dalam desimal.

Bit Referensi Bingkai Halaman Halaman 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. Konversikan alamat virtual berikut (dalam heksadesimal) ke alamat fisik yang setara (berikan jawaban dalam heksadesimal DAN desimal). Atur juga bit referensi untuk entri yang sesuai di tabel halaman. (3) saya. 0xBC2C ii. 0x00ED aku aku aku aku. 0xEA14 iv. 0x6901 v.0x23A1 vi. 0xA999

person Anneline    schedule 04.03.2014