实验三、页式地址重定位模拟

实验三、页式地址重定位模拟

一、实验目的:

1、  用高级语言编写和调试模拟实现页式地址重定位。

2、  加深理解页式地址重定位技术在多道程序设计中的作用和意义。

二、实验原理:

当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址寄存器。

三、实验内容:

1、  设计页表结构

2、  设计地址重定位算法

3、  有良好的人机对话界面

三、程序调试:

调试数据一:

系统页号对应块号情况(页号——>块号):

0--> 0   1-->42   2-->29   3-->15   4-->45   5-->31   6-->44   7-->43

8-->41   9-->28  10--> 1  11-->30  12-->12  13-->24  14--> 6  15-->32

16-->14  17-->27  18-->13  19-->46  20--> 7  21-->33  22-->10  23-->22

24-->40  25--> 2  26-->51  27-->11  28-->39  29-->23  30-->49  31-->50

32-->26  33-->16  34-->25  35--> 4  36-->47  37-->17  38--> 3  39-->48

40-->52  41-->36  42-->58  43-->35  44-->57  45-->34  46-->21  47-->63

48--> 5  49-->37  50-->18  51--> 8  52-->62  53-->56  54-->20  55-->54

56-->60  57-->19  58-->38  59--> 9  60-->61  61-->55  62-->59  63-->53

请输入逻辑地址(十进制):

2500

对应的物理地址为(十进制):

30148

Press any key to continue

调试数据二:

系统页号对应块号情况(页号——>块号):

0--> 0   1-->42   2-->29   3-->15   4-->45   5-->31   6-->44   7-->43

8-->41   9-->28  10--> 1  11-->30  12-->12  13-->24  14--> 6  15-->32

16-->14  17-->27  18-->13  19-->46  20--> 7  21-->33  22-->10  23-->22

24-->40  25--> 2  26-->51  27-->11  28-->39  29-->23  30-->49  31-->50

32-->26  33-->16  34-->25  35--> 4  36-->47  37-->17  38--> 3  39-->48

40-->52  41-->36  42-->58  43-->35  44-->57  45-->34  46-->21  47-->63

48--> 5  49-->37  50-->18  51--> 8  52-->62  53-->56  54-->20  55-->54

56-->60  57-->19  58-->38  59--> 9  60-->61  61-->55  62-->59  63-->53

请输入逻辑地址(十进制):

765497

本次访问的地址已超出进程的地址空间,系统将产生越界中断!

Press any key to continue

// PageMessage.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<iostream>
#include<iomanip>
using namespace std;

#define pagesize  1024
#define pagetablelength  64

/*系统页表*/
const int pagetable[pagetablelength]={0,42,29,15,45,31,44,43,
                               41,28,1,30,12,24,6,32,
                               14,27,13,46,7,33,10,22,
                               40,2,51,11,39,23,49,50,
                               26,16,25,4,47,17,3,48,
                               52,36,58,35,57,34,21,63,
                               5,37,18,8,62,56,20,54,
                               60,19,38,9,61,55,59,53};

int _tmain(int argc, _TCHAR* argv[])
{
    int logicaladdress=0;
    int pagenum=0;
    int w=0;
    cout<<"系统页号对应块号情况(页号——>块号):\n";
    for(int i=0;i<64;i++)
    {
        cout<<setw(2)<<i<<"-->"<<setw(2)<<pagetable[i]<<"  ";
        if(i%8==7)
            cout<<endl;
    }
    cout<<endl<<"请输入逻辑地址(十进制):\n";
    cin>>logicaladdress;

    /*公式:
        物理地址=页号对应的页块*页面大小+页内偏移
        页内偏移=逻辑地址-页面大小*页面数*/

    pagenum=logicaladdress/pagesize;            //页面数

    w=logicaladdress-pagenum*pagesize;            //页面偏移

    if((logicaladdress/pagesize)>pagetablelength)
    {
        cout<<"本次访问的地址已超出进程的地址空间,系统将产生越界中断!\n";
        return 0;
    }
    cout<<"对应的物理地址为(十进制):\n"<<pagetable[pagenum]*pagesize+w<<endl;

    system("pause");
    return 0;
}
时间: 2024-08-27 03:19:04

实验三、页式地址重定位模拟的相关文章

程序地址重定位和模块绑定

1.程序的构建 在构建程序的时候,链接器都会给程序设置一个默认的加载地址,即首选基地址,它表示该模块被映射到进程地址空间时最佳的内存地址.默认情况下,对于EXE程序而言,windows链接器会将它的首选基地址设置为0X400000(四十万),而DLL程序的首选基地址则被设置为0X10000000(1千万),然后链接器将该地址以及一些相关数据和代码的地址写入到PE文件中.首选基地址的是为了系统程序加载器设计的,作用是告诉加载器把程序优选加载到该首选基地址,然后就可以直接将其他的数据和代码加载到内存

arm重定位

首先看两行汇编代码:    1:  adr r0, _start    2:  ldr r1, =_start 同样是加载一个标号的地址值,adr和ldr有什么区别呢?注意这里的ldr不是命令ldr,而是伪指令ldr,若想区分它们请参看我的一篇博文<adr adrl ldr mov总结整理>. 要区分它们,就需要引入4个概念: 1.运行时地址起始位置:它芯片公司指定的一开始运行代码的位置.这个位置和芯片本身有关,不可改动.对于2440来说一般就是片内SRAM的首地址0x0:对于210来说就是片

PE知识复习之PE的重定位表

PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思.  如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234.  如果Imagebase 变了成了0x300000, 那么修正之后就是 ImageBase + RVA = 0X300000+1234 = 0x301234. 首先我们知道.一个EXE文件.会调用很多DLL(PE) 有多个PE文件组成. exe文件启动的基址 (ImageBase) 是0x40000. 假设我

了解动态链接(六)—— 重定位表

柳条青青,南风熏熏,幻化奇峰瑶岛,一天的黄云白云,那边麦浪中间,有农妇笑语殷殷.问后园豌豆肥否,问杨梅可有鸟来偷:好几天不下雨了,玫瑰花还未曾红透:梅夫人今天进城去,且看她有新闻无有.—— 徐志摩·夏日田间即景 无论是可执行文件还是 so,只要它依赖于其他 so(.dynsym 动态符号表中有导入符号存在),那么在编译链接阶段,这些符号的地址未知,所以只能在动态链接阶段对其进行地址重定位. 注意:以 PIC 编译的 so,虽然称“地址无关代码”,但也需要重定位.因为对于 PIC 的 so 来说,

关于重定位的一点理解

运行地址:程序定位的绝对地址,就是编译连接时定位的地址 加载地址:程序放置的地址 如果程序在flash中运行,运行地址和加载地址相同如果程序存储在flash中运行而是在RAM中运行,则加载地址和运行地址就不同,此时加载地址就是指向flash,运行地址指向RAM 重定位的一点感悟: 重定位就是当程序的加载地址和运行地址不同时,运行地址通过在编译连接过程中的连接脚本完成将可执行文件链接到程序真实运行的地址位置(可以理解为将已经加载的程序复制一份到链接地址处)之后通过长跳转将PC指针从加载地址处重新定

第二部分:S5PV210_重定位和链接脚本_2

重定位和链接脚本 (1)重定位:分为静态重定位和动态重定位 静态重定位:静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令 我们下面要分析就是静态重定位的情况. 动态重定位:动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位.更确切地说,是在每次访问内存单元前才进行地址变换.动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持. 图片的参考来源:http://c.biancheng.ne

S5pv210裸机实验——SDRAM重定位

一:为什么需要进行重定位 我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址).就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行.最后得到的二进制程序理论上是和你指定的运行地址有关的,将来这个程序被执行时必须放在当时编译链接时给定的那个地址(链接地址)下才行,否则不能运行(就叫位置有关代码).但是有个别特别的指令他可以跟指定的地址(链接地址)没有关系,也就是说这些代码实际运行时不管放在哪里都能正常运行. 二

u-boot移植(三)---修改前工作:代码流程分析3---代码重定位

一.重定位 1.以前版本的重定位 2.新版本 我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址.我们要修改地址,则必须知道程序的地址,就需要在链接的时候加上PIE选项: 加上PIE选项后,链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds): 然后我们根据这些地址的信息来修改代码,程序就可以复制到SDRAM的任何地方去. 二.代码流程 start.S中执行到了 bl _main,跳转到_ma

1203 实验三 进程调度模拟实验

实验三 进程调度模拟实验 物联网工程   张学玲  201306104140 一.        实验目的        用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.        实验内容和要求 实验内容 完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进程的状态可