首页 > 其他分享 >操作系统模拟虚拟存储器的地址变换过程

操作系统模拟虚拟存储器的地址变换过程

时间:2024-12-28 18:59:19浏览次数:7  
标签:frameNumber return 操作系统 int virtualPageNumber pageNumber 虚拟存储器 public 地址变换

设计用于模拟快表、页表、地址变换所用的寄存器的数据结构;
编制页表的初始信息文件,举例说明文件中具有的信息:共有5块,每块的状态、在内存和外存的起始地址等。
编程实现虚拟存储器地址变换算法程序,动态输入所要访问的逻辑地址,变换过程文字描述以及变换后的物理地址;
测试:输入有效、无效地址,测试程序的正确性和错误处理能力。
实验结果:
虚拟地址变换程序提供逻辑地址输入界面,形象地表示出变换成物理地址的过程与最后变换成的物理地址。
快表的地址变换原理
在这里插入图片描述
需要输入一个数 地址变换算法计算出所在的页号 先访问快表 找不到再访问页表 根据表里的块号 计算出物理地址 块号*块大小+偏移量

页表结构
PageTableManager

package AddressTransformation;

import java.util.HashMap;
import java.util.Map;

public class PageTableManager {
    private Map<Integer, PageTableEntry> pageTable = new HashMap<>();

    public static class PageTableEntry {
        private int frameNumber;
        private boolean present;
        private int pageNumber;

        public PageTableEntry(int pageNumber, int frameNumber, boolean present) {
            this.pageNumber = pageNumber;
            this.frameNumber = frameNumber;
            this.present = present;
        }

        public int getFrameNumber() {
            return frameNumber;
        }

        public boolean isPresent() {
            return present;
        }

        public int getPageNumber() {
            return pageNumber;
        }
    }

    public void setEntry(int pageNumber, int frameNumber, boolean present) {
        pageTable.put(pageNumber, new PageTableEntry(pageNumber, frameNumber, present));
    }

    public PageTableEntry getEntry(int pageNumber) {
        return pageTable.get(pageNumber);
    }
}

快表结构

TLBManager

package AddressTransformation;

import java.util.HashMap;
import java.util.Map;

public class TLBManager {
    private Map<Integer, TLBEntry> tlb = new HashMap<>();

    public static class TLBEntry {
        private int virtualPageNumber;
        private int physicalFrameNumber;

        public TLBEntry(int virtualPageNumber, int physicalFrameNumber) {
            this.virtualPageNumber = virtualPageNumber;
            this.physicalFrameNumber = physicalFrameNumber;
        }

        public int getVirtualPageNumber() {
            return virtualPageNumber;
        }

        public int getPhysicalFrameNumber() {
            return physicalFrameNumber;
        }
    }

    public TLBEntry lookup(int virtualPageNumber) {
        return tlb.get(virtualPageNumber);
    }

    public void update(int virtualPageNumber, int physicalFrameNumber) {
        tlb.put(virtualPageNumber, new TLBEntry(virtualPageNumber, physicalFrameNumber));
    }
}

地址变换算法
AddressTransformation.java

package AddressTransformation;

public class AddressTransformation {
        private PageTableManager pageTableManager;
        private TLBManager tlbManager;
        private int pageSize;

        public AddressTransformation(int pageSize) {
            this.pageSize = pageSize;
            this.pageTableManager = new PageTableManager();
            this.tlbManager = new TLBManager();
        }

        public String addressTranslation(int virtualAddress) {
            int pageNumber = virtualAddress / pageSize;
            int offset = virtualAddress % pageSize;

            TLBManager.TLBEntry tlbEntry = tlbManager.lookup(pageNumber);
            if (tlbEntry != null) {
                int frameNumber = tlbEntry.getPhysicalFrameNumber();
                return "TLB 命中。物理地址:" + (frameNumber * pageSize + offset) + "(帧号:" + frameNumber + ",偏移量:" + offset + ")";
            } else {
                PageTableManager.PageTableEntry ptEntry = pageTableManager.getEntry(pageNumber);
                if (ptEntry != null && ptEntry.isPresent()) {
                    int frameNumber = ptEntry.getFrameNumber();
                    tlbManager.update(pageNumber, frameNumber);
                    return "TLB 未命中。物理地址:" + (frameNumber * pageSize + offset) + "(帧号:" + frameNumber + ",偏移量:" + offset + ")";
                } else {
                    return "页面错误。页号 " + pageNumber + " 不在内存中。";
                }
            }
        }

        public void setPageTableEntry(int pageNumber, int frameNumber, boolean present) {
            pageTableManager.setEntry(pageNumber, frameNumber, present);
        }

        public void setTLBEntry(int virtualPageNumber, int physicalFrameNumber) {
            tlbManager.update(virtualPageNumber, physicalFrameNumber);
        }

}

测试类
Test.java

package AddressTransformation;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        AddressTransformation simulator = new AddressTransformation(1024); // 假设页面大小为1024

        // 初始化页表和TLB
        simulator.setPageTableEntry(1, 0, true);
        simulator.setPageTableEntry(2, 1, true);
        simulator.setPageTableEntry(3, 2, true);
        simulator.setPageTableEntry(4, 3, true);
        simulator.setPageTableEntry(5, 4, true);

        simulator.setTLBEntry(1, 0);
        simulator.setTLBEntry(2, 1);

        Scanner scanner = new Scanner(System.in);
        System.out.println("输入虚拟地址(或输入-1退出):");
        while (true) {
            int virtualAddress = scanner.nextInt();
            if (virtualAddress == -1) {
                break;
            }
            String result = simulator.addressTranslation(virtualAddress);
            System.out.println(result);
            System.out.println("输入虚拟地址(或输入-1退出):");
        }
        scanner.close();
    }
}

测试结果
在这里插入图片描述

标签:frameNumber,return,操作系统,int,virtualPageNumber,pageNumber,虚拟存储器,public,地址变换
From: https://blog.csdn.net/weixin_74234462/article/details/144763922

相关文章

  • CHCP(Change Code Page)命令源自 MS-DOS 操作系统,是用于显示或设置当前活动代码页(Code P
    chcp|MicrosoftLearnCHCP和相关说明,以下是按功能分类的表格:功能分类命令/选项说明查看当前活动代码页CHCP显示当前活动的代码页编号。设置活动代码页CHCP[nnn]设置指定的代码页编号,nnn 为要设置的代码页编号。进一步说明:查看当前活动代码页:CHCP......
  • QEMU(Quick Emulator)是一个开源的虚拟化和仿真软件,旨在提供高效的硬件虚拟化和操作系统
    DownloadQEMU-QEMUQEMUforWindows–Installers(64bit) QEMU(QuickEmulator)是一个开源的虚拟化和仿真软件,旨在提供高效的硬件虚拟化和操作系统仿真功能。它能够让用户在不同的硬件架构上运行和测试操作系统,不仅支持x86架构,还支持ARM、PowerPC、SPARC、MIPS等多种......
  • lpksetup.exe与 语言包安装 和 本地化设置 相关,主要用于帮助用户添加或删除 Windows
    lpksetup.exe是Windows操作系统中的一个可执行文件,位于C:\Windows\System32目录下。它与语言包安装和本地化设置相关,主要用于帮助用户添加或删除Windows操作系统的语言包。以下是对lpksetup.exe的详细介绍:1. 功能lpksetup.exe主要用于管理Windows操作系统的语......
  • THU-rCore 操作系统实验踩坑日寄-1
    rCore是清华大学操作系统实验uCore之rust版本。不得不说能在本科阶段提供这种高质量的操作系统实验课程,并且还是一次提供两种语言的选择确实很厉害。出于“学习一门语言的最好方法就是用这个语言做一个项目”的想法,这次就选了rCore作为学习rust的桥梁。在做rCore之前,提前刷了一部......
  • wevtutil 是 Windows 操作系统中的一个命令行工具,用于管理和操作事件日志。事件日志是
     wevtutil是Windows操作系统中的一个命令行工具,用于管理和操作事件日志。事件日志是操作系统、应用程序和系统服务等记录的重要信息文件,它们用于存储系统运行时的信息、警告和错误,帮助管理员排查问题和进行故障排除。wevtutil提供了强大的功能来查看、导出、清理、配置和管......
  • 在不同操作系统上安装 PostgreSQL
    title:在不同操作系统上安装PostgreSQLdate:2024/12/26updated:2024/12/26author:cmdragonexcerpt:PostgreSQL是当今最受欢迎的开源关系数据库管理系统之一,由于其强大的功能和灵活性,广泛应用于不同的行业和应用场景。在开始使用PostgreSQL之前,用户需要了解......
  • CMD命令大全:Windows操作系统下的强大工具指南
     前言       在Windows操作系统中,CMD(命令提示符)是一个功能强大的工具,它允许用户通过输入各种命令来执行各种系统操作和管理任务。本CMD命令大全旨在为用户提供一份详尽、实用的命令指南,帮助用户快速掌握CMD的各种功能和用法。   本文中的命令,涉及优化系......
  • 在不同操作系统上安装 PostgreSQL
    title:在不同操作系统上安装PostgreSQLdate:2024/12/26updated:2024/12/26author:cmdragonexcerpt:PostgreSQL是当今最受欢迎的开源关系数据库管理系统之一,由于其强大的功能和灵活性,广泛应用于不同的行业和应用场景。在开始使用PostgreSQL之前,用户需要了解如何在......
  • 从0开始的操作系统-000-写在前面的话
    今天是2024年12月25日,圣诞节快乐。其实很早就想开始跟着做一个比较长期的项目来锻炼自己,但是受限于各种原因—时间不足啊、学校里的ddl啊、看中的项目虽然酷炫但是好难啊—之类的,一直往后拖延着拖延着。直到大三上期结束,自己有了一些课程外的开发经验,才鼓起勇气正式开始。不算个......
  • Linux操作系统基础
    1、linux是什么linux是unix操作系统支持多任务、多线程、多cpu的操作系统2、linux是命令行的操作系统windows系统是图形化界面的操作系统windows和linux区别windows是收费的,linux是免费的windows经常有安全补丁,linux就没有,linux更安全3、linux优点......