ฉันจะใช้ตารางเพจเพื่อแปลงที่อยู่เสมือนเป็นที่อยู่จริงได้อย่างไร

สมมติว่าฉันมีตารางหน้าปกติ:

ตารางหน้า (ขนาดหน้า = 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 นี่หมายความว่ามันอยู่ในหน้า #12 โดยมีออฟเซ็ตที่แน่นอนใช่หรือไม่

ฉันจะเปลี่ยนสิ่งนั้นให้เป็นที่อยู่ทางกายภาพของ "51996" ได้อย่างไร


person Community    schedule 06.05.2009    source แหล่งที่มา


คำตอบ (5)


ในการกำหนดหน้าของที่อยู่หน่วยความจำที่กำหนด ให้ใช้หมายเลข P บิตแรก (ของบิต N)

P = lg2(numberOfPages)
ในตัวอย่างของคุณ P=lg2(16)=4

ดังนั้น 4 บิตแรกของที่อยู่หน่วยความจำที่กำหนดจะบอกเราถึงหน้านั้น นั่นหมายความว่าส่วนที่เหลือควรเป็นค่าชดเชยตั้งแต่เริ่มต้นหน้านั้น

ที่อยู่ตัวอย่างของคุณ 51996 คือ 1100101100011100 ในรูปแบบไบนารี เช่น. [1100:101100011100].

1100 (12 เป็นทศนิยม) คือหมายเลขหน้า
101100011100 (2844 เป็นทศนิยม) คือออฟเซ็ต

ตอนนี้เราต้องค้นหาว่าหน้า 12 อยู่ที่ไหนในหน่วยความจำ
เมื่อดูตารางเฟรมของคุณ ปรากฏว่าหน้า 12 อยู่ในเฟรมที่ 6 ในระบบที่หน่วยความจำทั้งหมดสามารถเพจได้ (เช่น ไม่มีหน่วยความจำที่แมป IO) เฟรมหน้าที่ 6 จะอยู่ที่ (entriesPerPage*frameNum)-1

ในกรณีนี้ 4000*6-1 = 23999 (ต้องใช้ "-1" เนื่องจากหน่วยความจำมีดัชนี 0)

ในกรณีนี้ 4096*6-1 = 24575 (ต้องใช้ "-1" เนื่องจากหน่วยความจำมีดัชนี 0)

ตอนนี้สิ่งที่เราต้องทำคือเพิ่มออฟเซ็ตและเรามีที่อยู่หน่วยความจำกายภาพ:

23999 + 2844=26843 = 0x68DB

24575 + 2844 = 27419 = 0x6B1B

เสร็จแล้ว!

หวังว่าสิ่งนี้ (แก้ไข) จะมีประโยชน์ XD

แก้ไข: ขอบคุณ Jel ที่จับผิดของฉัน :) ขอบคุณ user8 ที่จับผิดอื่น ๆ ของฉัน! (frameNum แทน pageNum)

person ParoXoN    schedule 06.05.2009
comment
คำตอบของคุณหมายความว่าที่อยู่เสมือนมีความยาวแปรผันสำหรับกระบวนการที่แตกต่างกันหรือไม่ ตัวอย่างเช่น หากมีสองกระบวนการ กระบวนการหนึ่งมี 16 หน้า และอีกกระบวนการมีเพียง 1 หน้า บิตที่ใช้ระบุหมายเลขหน้าจะแตกต่างกัน ดังนั้นความยาวสุดท้ายของที่อยู่เสมือนจะแตกต่างกัน - person cheng; 14.03.2011
comment
@cheng: ที่อยู่มีความยาวคงที่ตลอดกระบวนการ ดังนั้นหากกระบวนการมีเพียงหน้าเดียว ที่อยู่ทั้งหมดจะเริ่มต้นด้วยค่าเดียวกัน ในตัวอย่างด้านบนที่มี 16 หน้า สี่บิตแรกของกระบวนการหน้าเดียวจะเป็น 0b0000 - person ParoXoN; 16.04.2015
comment
เหตุใดคุณจึงคูณด้วย 4000 แทนที่จะเป็น 4096 ในขั้นตอนที่สองถึงขั้นตอนสุดท้าย - person Jel; 25.11.2015
comment
@Jel: จับได้ดี! มันควรจะเป็น 4096 ฉันเดาว่าเมื่อฉันอ่านคำถามครั้งแรก ฉันคิดว่า 4k===4000 แม้ว่าคำถามจะกล่าวถึง 4096 มากกว่าหนึ่งครั้งอย่างชัดเจนก็ตาม ขอบคุณ! - person ParoXoN; 27.11.2015
comment
ในสูตรของคุณ (entriesPerPage*pageNum)-1 pageNum ควรเป็น frameNum - person Dimitar; 14.01.2016

ถ้าฉันเข้าใจคำถามของคุณอย่างถูกต้อง (ฉันอาจจะไม่) คุณต้องการทราบวิธีค้นหาที่อยู่ทางกายภาพจากที่อยู่เสมือนโดยใช้โครงสร้างตารางหน้า ในกรณีนั้น ให้แกล้งทำเป็นว่าคุณเป็นผู้ประมวลผล ใช้ที่อยู่ที่สำคัญที่สุด 10 บิตเพื่อค้นหาตารางหน้าในไดเร็กทอรีหน้า (ตารางหน้าระดับบนสุด) 10 บิตถัดไปคือดัชนีลงในตารางหน้า (ตารางหน้าระดับล่าง) ใช้ที่อยู่ในรายการตารางของหน้านั้นเพื่อค้นหาที่อยู่ของหน้าจริง สิบบิตสุดท้ายคือที่อยู่ไบต์ลงในเพจ

อย่างไรก็ตาม คุณอาจพบผู้คนจำนวนมากที่เข้าใจคำถามประเภทนี้ในไซต์เกี่ยวกับระบบปฏิบัติการ เช่น OSDev. ฉันไม่สามารถอธิบายรายละเอียดได้มากนักในคำตอบนี้เพราะฉันไม่ได้ทำสิ่งประเภทนี้มาหลายปีแล้ว

person Zifre    schedule 06.05.2009

นี่อาจช่วยได้:

    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
มันอยู่ใน java แต่น่าจะช่วยได้ - person oscar; 10.05.2012

ขั้นตอนแรก : 51996/4000 = 12 -> p , ยังคงอยู่= 3996 -> d (ออฟเซ็ต)

ตอนนี้ดูที่ตาราง p(12) = 6

ขั้นตอนที่สอง : (6*4000) + 3996 : 27996

ที่อยู่จริงคือ 27996

person tea-addict    schedule 30.05.2015

ตารางเพจต่อไปนี้ใช้สำหรับระบบที่มีที่อยู่เสมือนและฟิสิคัล 16 บิต และมีเพจ 4,096 ไบต์ บิตอ้างอิงถูกตั้งค่าเป็น 1 เมื่อมีการอ้างอิงเพจ เป็นระยะๆ เธรดจะลบค่าทั้งหมดของบิตอ้างอิงเป็นศูนย์ เส้นประสำหรับกรอบหน้าแสดงว่าหน้าไม่อยู่ในหน่วยความจำ อัลกอริธึมการแทนที่หน้าเป็นภาษาท้องถิ่น LRU และตัวเลขทั้งหมดจะแสดงเป็นทศนิยม

บิตอ้างอิงเฟรมหน้าเพจ 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 ก. แปลงที่อยู่เสมือนต่อไปนี้ (เป็นเลขฐานสิบหก) เป็นที่อยู่ทางกายภาพที่เทียบเท่า (ให้คำตอบเป็นเลขฐานสิบหกและทศนิยม) ตั้งค่าบิตอ้างอิงสำหรับรายการที่เหมาะสมในตารางหน้าด้วย (3) ผม. 0xBC2C ii. 0x00ED iii. 0xEA14 IV 0x6901 วี 0x23A1 วี 0xA999

person Anneline    schedule 04.03.2014