精华内容
下载资源
问答
  • 地址重定位
    千次阅读
    2018-09-03 14:44:16

    更多相关内容
  • 当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址...
  • 里面有源程序和实验报告,源程序已经调试过了有什么问题可问我。
  • 模拟实现页面地址重定位实习报告.pdf
  • 地址重定位:静态重定位和动态重定位

    万次阅读 多人点赞 2019-04-24 09:06:18
    地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令和数据进行修改的过程 将逻辑地址空间重定位到物理地址空间的时机有三种: 1、程序编译连接时:符号绑定,各Obj模块的相对...

    地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令和数据进行修改的过程

    将逻辑地址空间重定位到物理地址空间的时机有三种:

    1、程序编译连接时:符号绑定,各Obj模块的相对虚拟地址空间 -->统一的虚拟地址空间;可指定一个BaseAddress以优化装载时的重定位

    2、程序装入内存时: 虚拟地址空间 -->虚拟地址空间;如果映像文件中的Base Address 与实际装载的起始虚拟地址空间,不一致,则需要根据偏移量 重定位 重定位项表

    3、程序执行时:虚拟地址空间 -->物理地址空间, MMU

     

     

    以下内容转自:http://bbs.pediy.com/showthread.php?t=76876

      在这之前我一直对地址重定位的细节不是很了解。以下文章摘自《操作系统原理DOS篇(第二版)》。是我目前看过的关于重定位的最好的文章。与大家分享 一下。
      以下介绍程序是如何装入内存,从而变成在计算机内可执行的形式的。
      在用汇编语言或高级语言编写的程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合叫做“名字空间”。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块,然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把目标模块obj中的地址称为相对地址(或逻辑地址),而把相对地址的集合叫做“相对地址空间”或简单地叫做“地址空间”。此即1、程序编译连接时的重定位,也叫符号绑定。
      装配模块虽然具有统一的地址空间,但它仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与 地址有关的代码,这一过程叫做地址重定位。
      地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为“绝对地址空间”或“存储空间”。

      地址重定位完成的相对地址转换成内存的绝对地址工作又称为地址映射(map)、按照重定位的时机,可分为静态重定位和动态重定位。

           

           重定位是由操作系统安排的。  在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。

     

    一、静态重定位:程序装入内存时
      静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。
      例如,一个以“0”作为参考地址的装配模块(程序可以也可以在编译连接时指定一个Base Address基地址(虚拟地址空间),并完成以此Base Address为参考地址的重定位,这样在装载时,如果实际的装载起始地址(虚拟地址空间)和Base Address相同,就无需再进行转载时的静态重定位),要装入以1000为起始地址的存储空间。显然,在装入之前要做某些修改,程序才能正确执行。例如,MOV  EAX,[500]这条指令的意义,是把相对地址为500的存储单元内容1234装入EAX号累器。现在内容为1234的存储单元的实际地址为1500, 即为相对地址(500)加上装入的地址(1000),因此,MOV EAX,[500]这条指令中的直接地址码也要相应地加上起始地址,而成为MOV  EAX,[1500]。
      程序中涉及直接地址的每条指令都要进行这样的修改。需要修改的位置称为重定位项,所做的加实际装入模块起始地址修改中的块起始地址称为重定位因子。
      为支持静态重定位,连接程序在生成统一地址空间和装配模块时, 应产生一个重定位项表,连接程序此时还不知道装配模块将要装入的实际位置,故重定位表 所给出的需修改位置是相对地址所表示的位置。
      操作系统的装入程序要把装配模块和重定位项表一起装入内存。由装配模块的实际装入起始地址得到重定位因子,然后实施如下两步:
      (1)取重定位项,加上重定位因子而得到欲修改位置的实际地址;
      (2)对实际地址中的内容再做加重定位因子的修改,从而完成指令代码的修改。
      对所有的重定位项实施上述两步操作后,静态重定位才完成,尔后可启动程序执行。使用过的重定位项表内存副本随即被废弃。

      静态重定位有着无需硬件支持的优点,但存在着如下的缺点:一是程序重定位之后就不能在内存中搬动了;二是要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域内。

    如图:

                             


    二、动态重定位:程序执行时
      动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位。更确切地说,是在CPU每次访问内存单元前才进行地址变换。动态重定位可使装配模 块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持。
      程序的目标模块装入内存时,与地址有关的各项均保持原来的相对地址不进行任何修改。如MOV 1,[500]这条指令仍是相对地址500。当此模块被 操作系统调度到处理机上执行时,操作系统将把此模块装入的实际起始起始地址减去目标模块的相对基地址,然后将其差值装入定位寄存器中。当CPU取得一条访 问内存的指令时,地址变换硬件逻辑自动将指令中的相对地址与定位寄存器中的值相加,再依此和值作为内存绝对地址去访问该单元中的数据。
      由此可见,进行动态重定位的时机是在指令执行过程中,每次访问内存前动态地进行。采取动态重定位可带来两个好处:
      (1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;
      (2)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。

      动态重定位技术所付出的代价是需要硬件支持。

     

    如图:

                                          

     

    总结:

    静态地址重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故成为静态重定位。

    优点:无需硬件支持

    缺点:1)程序重定位之后就不能在内存中搬动了;2)要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域中。

     

    动态地址重定位:不是在程序执行之前而是在程序执行过程中进行地址重定位。更确切的说,是在每次访问内存单元前才进行地址变换。动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件一定位寄存器的支持。

    优点:1)目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;2)一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储区域可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。

    缺点:需要硬件支持。

    展开全文
  • 1)分页地址变换机构将相对地址分为(页号,页内地址) 页号 P=INT[A/L];页内位移量 W=A MOD L; 2)读取PTR中的页表长度。 IF 页号<页表长度 THEN GOTO 3)ELSE 越界中断; 3)读取PTR中的页表始址 ...

    目录

    一、基本地址变换机构

    二、地址变换过程

    三、实验内容

    四、代码实现

    五、运行结果


    一、基本地址变换机构

    二、地址变换过程

    • 1)分页地址变换机构将相对地址分为(页号,页内地址)      
    •       页号 P=INT[A/L];页内位移量  W=A MOD L;  
    • 2)读取PTR中的页表长度。          
    •       IF 页号<页表长度 THEN GOTO 3)ELSE 越界中断;  
    • 3)读取PTR中的页表始址
    •       计算:页表始址+页号×页表项长度          
    •       得到该页表项在页表中的位置,对应得到该页的物理块号。装入物理地址寄存器。  
    • 4)将逻辑地址中的页内地址送入物理地址寄存器的块内地址字段,拼接,得到最后的物理地址:块号×块长度+W

    三、实验内容

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

    • 1、 设计页表结构  
    • 2、 设计地址重定位算法  
    • 3、 有良好的人机对话界面

    四、代码实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>   //封装时间的类库,时间不会重复,产生随机数最合适
    
    #define N 100  //设定的页表最大长度为100
    #define True 1
    #define False 0
    
    int process;      //进程大小
    int Page_length; //页长
    int Page_Num;   //页表长度
    int Logical_Address;  //逻辑地址
    int Physical_Address;//物理地址
    int a[N];   //物理块号集合
    typedef struct PageTable  //定义一个页表项
    { 
    	int page_num;   //页号
    	int block_num; //对应的物理块号
    }PageTable;
    
    PageTable PT[N];  //定义一个页表
    
    typedef struct LogicalAdd  //定义逻辑地址
    { 
    	int page_num;  //逻辑地址对应的页号
    	int page_add; //对应的页内地址
    }LogicalAdd;
    LogicalAdd LA;          
    
    /*****************输入进程信息*****************/
    void input() 
    { 
    	printf("请输入进程大小:" ); 
    	scanf("%d", &process); 
    	printf("请输入页面大小:"); 
    	scanf("%d", &Page_length);
    } 
    
    /*****************获取到最小为m,最大为n,总数为k个的不同随机数*****************/
    void get_rand(int m, int n, int k)//结果存在a数组中
    {
        /*-----srand(time(0))----- */
    	/*根据时间生成一个随机数,伪随机函数实现内存随机分配, 
    	  srand函数就用来初始化这个发生器,
    	  参数time(0)能够生成从1970年1月1日到当前机器时间的秒数,
    	  这个数在你每次执行程序的时候都会不断增长、变化,
    	  所以用它当做种子来初始化发生器,
    	  每次运行程序时,页号对应的块号都会发生变化。*/
    	srand(time(0)); 
    	int i, j, t;
        for(i = 0; i < k; )
        {
            /*rand()会返回一个范0~RAND_MAX(至少是32767)之间的伪随机整数
            采用"模除+加法"的方法,产生指定范围内的随机整数
    		在调用rand()函数之前,可以使用srand()函数设置随机数种子,
    		如果没有设置随机数种子,rand()函数在调用时,自动设计随机数种子。
    		随机数种子相同,每次产生的随机数也会相同。*/
    		t = rand() % (n-m+1) + m; //[m,n] 
            for(j = 0; j < i; j ++) //比较新生成的随机数t与a[0]~a[i-1] 
                if(a[j] == t) break;
            if(j == i)//不重复: j==i时,说明t与a数组中的数据(a[0]~a[i-1])不重复 
                a[i++] = t;//记录随机数。等价于a[i]=t; i++;
        }
    }
    
    /*****************初始化函数,生成页表*****************/
    int init()  
    {  
    	if(process % Page_length!=0)
    		Page_Num = process / Page_length + 1;  
    	else
    		Page_Num = process / Page_length;  
    	if(Page_Num > N)
    	{
    		printf("该进程的页表长度为%d,大于设定长度%d,无法存储\n", Page_Num, N); 
    		return False;
    	}
    		
    	get_rand(0, N-1, Page_Num); //生成Page_Num个0~N-1的随机数,存到数组a中 
    	 
    	for (int i = 0; i < Page_Num; i++) //初始化页表
    	{ 
    		PT[i].page_num = i; 
    		PT[i].block_num = a[i]; //页号对应的物理内存块号
    	}  
    	return True;
    } 
    
    /*****************输出页表信息*****************/
    void output( ) 
    {
    	printf("\n");
    	printf("页表长度为:%d\n", Page_Num);
    	printf("构造的页表如下:\n");
    	printf("\n");
    	printf("\t页号\t块号\n");
    	for (int i = 0; i < Page_Num; i++)
    	{ 
    	    printf("\t %d\t",PT[i].page_num);
    		printf(" %d\n",PT[i].block_num);
    	} 
    	printf("\n");	
    } 
    
    /*****************转换函数,逻辑地址转换为物理地址*****************/
    int translate()  
    { 
    	printf("输入逻辑地址:"); 
    	scanf("%d", &Logical_Address); 
    	int i = 0; 
    	LA.page_num = Logical_Address / Page_length;
    	LA.page_add = Logical_Address % Page_length;
    
    	if (LA.page_num >= Page_Num) 
    	{
    		printf("所查询的逻辑地址不在该页内,转换失败\n"); 
    		return False;
    	}
    	
    	while (i < Page_Num) 
    	{ 
    		if (PT[i].page_num == LA.page_num) //找到页表项 
    		{ 
    			//找到LA.page_num对应的物理块号PT[i].block_num
    			Physical_Address = PT[i].block_num * Page_length + LA.page_add;
    			printf("物理地址为:%d\n", Physical_Address);
    			break; 
    		}          
    		else i++; 
    	}
    	return True;
    } 
     
    /*****************主函数*****************/
    int main()
    { 
    	int choice;  
    	printf("\t---------------------------------------------------\n");
    	printf("\t||                                               ||\n");
    	printf("\t||        欢迎使用页式地址重定位模拟系统         ||\n");
    	printf("\t||                                               ||\n");
    	printf("\t||                                               ||\n");
    	printf("\t||                 在此输入个人姓名:******      ||\n");
    	printf("\t---------------------------------------------------\n");
    
    	for (;;)
    	{
    		printf("\t||                                               ||\n");
    	    printf("\t||    请选择:                                   ||\n");
    	    printf("\t||          1:重定位        2:退出               ||\n");
    		printf("\t||                                               ||\n");
    	    printf("\t---------------------------------------------------\n");
    		scanf("%d", &choice);
    		switch (choice)
    		{ 
    		case 1:
    			input(); 
    			if (init() == False) return -1; 
    			output();
    			translate();			
    			break; 		
    		case 2: 
    			printf("已经退出\n");  
    			exit(0); //正常退出
    		default:
    			printf("输入的值不合法,请重新输入1或2\n"); 
    		} 
    	} 
    	return 0; 
    }

    五、运行结果

    展开全文
  • 操作系统---页式地址重定位

    千次阅读 2021-05-06 17:41:38
    页式地址重定位 要求: 一、实验目的: 1、 用高级语言编写和调试模拟实现页式地址重定位。 2、 加深理解页式地址重定位技术在多道程序设计中的作用和意义。 二、实验原理: 当进程在CPU上运行时,如指令中涉及逻辑...

    页式地址重定位

    要求:

    一、实验目的:
    1、 用高级语言编写和调试模拟实现页式地址重定位。
    2、 加深理解页式地址重定位技术在多道程序设计中的作用和意义。
    二、实验原理:
    当进程在CPU上运行时,如指令中涉及逻辑地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器,再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址寄存器。
    三、实验内容:
    1、 设计页表结构
    2、 设计地址重定位算法
    3、 有良好的人机对话界面

    
    #include<bits/stdc++.h>
    using namespace std;
    #define pagesize  4096
    #define pagetablelength  64
    /*系统页表*/
    const int pagetable[pagetablelength]={0,42,25,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,29,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 main()
    {
        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;
    }
    

    对应截图如下:
    在这里插入图片描述

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

    展开全文
  • 模拟实现页面地址重定位实习报告.doc
  • 进程调度、银行家算法、页式地址重定位模拟,LRU算法模拟和先来先服务算法代码
  • 操作系统实验3 页式地址重定位模拟

    万次阅读 多人点赞 2019-04-28 14:22:20
    【实验名称】页式地址重定位模拟 【实验目的】 1.掌握和理解页式地址重定位模拟的基本思路和实现过程; 2. 理解页式地址重定位技术在多道程序设计中的作用和意义。 【实验原理】 页式管理是一种内存空间...
  • 页式地址重定位模拟(java版本)

    千次阅读 2020-10-27 14:59:10
    System.out.println(" 页面地址重定位" + '\n' + "1.显示页表信息" + '\n' + "2.计算物理地址" + '\n' + "3.退出程序"); Scanner s = new Scanner(System.in); System.out.println("请输入...
  • 4、代码重定位 4.1、重定位代码详解 1、代码启动过程简要分析 问题1:代码下载到哪里去? 数据手册上会有说明,位置不是我们想往哪里下载就往哪里下载的,下载错了启动的时候就找不到代码的位置在哪,一般是下载到...
  • 操作系统地址重定位相关练习题

    千次阅读 2021-01-12 16:34:18
    一、【问题描述】 某虚拟存储器的用户空间...假定某时刻系统为用户的第0、1、2、3页分配的物理块号为5、10、4、7,而该用户作业的长度为6页,试将十六进制的虚拟地址0A5C、103C转换成物理地址。 二、【正确答案】 ...
  • 页式存储管理地址重定位问题

    千次阅读 2020-04-30 20:34:21
    假设某作业为3.5k大小,在逻辑地址1000号单元处有指令Mov R1,[3000],3000号单元有数据5678。采用分页式存储管理,页面大小为1k字节,该作业进入内存后,其页面0,1,2,3被分配到内存的2、4、6、7块中,完成下列...
  • 操作系统——内存地址重定位

    千次阅读 2019-09-30 12:40:02
    进程代码中会有具体语句表明代码的入口地址,但这个地址之只能是相对地址,因为任何时刻内存的状态都是不确定的,不能保证哪个物理地址一定是空闲的并且可以让用户使用的,但cpu只能根据指令找到对应的物理地址来...
  • 操作系统实验-页面地址重定位

    千次阅读 2016-12-13 23:13:14
    页面地址重定位 #include #include #define PagetableLength 64 using namespace std; int PageTable[PagetableLength] = {0}; //前提:地址是从0开始的 int main() { int LogicalAddress = 0; int PageNum = 0...
  • 实验三、页式地址重定位模拟

    千次阅读 2017-11-06 00:16:00
    实验三、页式地址重定位模拟 一、实验目的: 1、 用高级语言编写和调试模拟实现页式地址重定位。 2、 加深理解页式地址重定位技术在多道程序设计中的作用和意义。 二、实验原理: 当进程在CPU上运行时,如指令...
  • 关于地址重定位

    千次阅读 2013-12-22 17:06:39
     地址重定位完成的相对地址转换成内存的绝对地址工作又称为地址映射(map)、按照重定位的时机,可分为静态重定位和动态重定位。 一、静态重定位  静态重定位是在程序执行之前进行重定位,它根据装配模块将要...
  • 在程序装入过程中随即进行的地址变换方式称为静态地址映射或静态重定位。 进行静态重定位要求被装入的程序本身是可以重定位的。(软件支持:重定位装入...静态地址重定位是在程序装入内存前完成从逻辑地址到物理...
  • 操作系统 - 地址重定位

    千次阅读 2015-04-13 09:49:48
     一、主存的无力组织和逻辑组织 1. 绝对地址 计算机中,存储器是按字组织,每个字由若干”位“组成(不同计算...绝对地址是内存的真实地址——物理地址 存储空间(物理地址空间):绝对地址集合 2. 虚拟地址
  • dll基地址重定位

    2019-07-10 22:07:35
    地址重定位:当进行多个dll动态库合起来编译成一个exe文件的时候,每个dll和exe都有默认的基地址,当加载器加载exe的时候,其实的某个dll会发生基地址改变,因此当加载完后,之前dll里面的指令和加载之后的不一样...
  • 【转】地址重定位:静态重定位和动态重定位

    万次阅读 多人点赞 2012-05-03 15:42:36
    地址重定位就是操作系统将逻辑地址转变为物理地址的过程。。。也就是对目标程序中的指令和数据进行修改的过程 将逻辑地址空间重定位到物理地址空间的时机有三种:  1、程序编译连接时。  2、程序装入...
  • 我从前最怕旁人火眼金睛,如今,倒是盼着有人能够洞幽烛远。如此,就能赠我一点欢喜。 题目: 题解:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 154,300
精华内容 61,720
关键字:

地址重定位

友情链接: vb6 vnc.rar