分页存储管理方式的地址转换机构详解

结合操作系统(汤子瀛版)和王道版操作系统,对内存管理中,分页存储管理方式的地址转换进行整理总结(即根据逻辑地址寻找物理地址)

一、基本概念

1.逻辑地址:(工具书中的解释)

(1)在有地址变换功能的计算机中,访问指令给出的地址 (操作数) 叫逻辑地址,也叫相对地址

(2)把用户程序中使用的地址称为相对地址即逻辑地址。

:逻辑地址包含页号和页内偏移两部分,通过页内偏移的位数可以知道页面的大小。(在题目中,有时会给出十进制的数)

2.物理地址:在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址

:物理地址包含页帧号和页内偏移两部分,根据逻辑地址查找页表即可找到在内存中的页帧号,物理地址中的页内偏移同逻辑地址中的相同。

3.页、页帧(页框)、块

分页的思想:把主存空间分为大小相等且固定的块,块相对较小,作为主存的基本单位。进程中的块称为页,内存中称为页帧(页框),外存中直接称为块。

4.页表、页表项

(1)为了方便找到每个页号在内存中对应的物理块,系统为每一个进程建立一张页表。 注意是为每个进程建立一张页表。

(2)页表中的每一项叫做页表项。

注:根据页号的位数可以算出页表项数,根据页表项的大小和页表项数可以算出页表的大小。

例:若页号有20位,页表项大小为4B,则页表大小为2的20次方*4B=4MB。题目中页表项大小一般会给出。

注:注意区分页表长度和页表项长度

(1)页表长度:页表中共有多少页

(2)页表项长度:在页表中页地址占多大的存储空间

5.页表寄存器

在系统中通常设置一个页表寄存器,存放页表在内存中的始址F和页表长度M。进程未执行时,页表的始址和长度存放在进程控制块中,当进程执行时,才将页表始址和长度存入页表寄存器。

二、地址转换(根据逻辑地址求出在内存中的物理地址)

1.根据逻辑地址可找出页号

(1 )若逻辑地址由二进制表示,根据页号位数(或逻辑地址位数-页内偏移位数)即可确定。

(2)若逻辑地址由十进制表示,需要根据页号位数算出页号

例:若逻辑地址为4000,当页内偏移为10位时,页号为4000/1k=3,当页内偏移为11位时,页号为4000/2k=1。

2.判断是否越界

比较页号和页表寄存器中的页表长度,若页号不在查找的页表中,越界中断。

3.在页表中找出页号对应的物理块号

页号对应的页表项地址=页号*页表项长度+页表起始地址

4.求出在内存中的物理地址

(1)在页表中找到页号对应的块号

(2)块内偏移=页内偏移

三、题目求解

1.页面大小

通过页内偏移的位数可以知道页面的大小

2.页表大小

页表长度*页表项大小

3.根据十进制的逻辑地址求出页号在页表中的物理地址

(1)页号的求法见上面(二、1)

(2)页号求出后加上页表起始地址即可

4.求物理地址

参考二(地址转换)

5.未完待续。。。

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、 课程设计目的 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 二、课程设计的内容 1、分页方式的地址换算 2、分段方式的地址换算 3、段的地址换算 三、程序运行 1、 分页地址转换: 数据: 逻辑地址:223、面大小:23 2、 分段地址转换 数据: 逻辑地址段号:223、段内地址:23 3、 段地址换算 逻辑地址的段号:2、号:3 四、程序源代码 #include #include int page(int A,int L ); int Segment(int sn,int sl); int SegPagt(int sn,int pn,int pd); typedef struct segtable { int segf[256]; int segl[256]; }segtable; struct segtable st; typedef struct segpagt { int segf[256]; int segl[256]; int ptl[256]; int pt[256]; int pf[256]; int pl; }segpagt; struct segpagt sp; int main() { int code; int pl,pa,sn,sd,pd,pn; //const int ptl ; int temp; do{ printf("----------------地址换算过程----------------------------\n\n"); printf(" 1.分页地址换算\n"); printf(" 2.分段地址换算\n"); printf(" 3.段地址换算\n"); printf(" 4.结束运行\n\n"); printf("----------------------------------------------------------\n"); printf("请输入您的选择:"); scanf("%d",&code); switch(code) { case 1:{ printf("注意:请演示设定表长度小于\n"); printf("请输入换算的逻辑地址:\n"); scanf("%d",&pa); printf("面大小(B):\n"); scanf("%d",&pl); page(pa,pl); }break; case 2:{ printf("请演示设定段表长度小于\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("段内地址:\n"); scanf("%d",&sd); Segment(sn,sd); }break; case 3:{ printf("预设定段表长为,面大小为\n"); printf("请输入逻辑地址的段号:\n"); scanf("%d",&sn); printf("号:\n"); scanf("%d",&pn); printf("内地址:\n"); scanf("%d",&pd); SegPagt(sn,pn,pd); }break; case 4:{}break; } }while (code<4); } int page(int A,int L) { int d,P,kd,i; int WD; int PT[256]; for(i=1;iL) printf("号大于表长度,越界中断\n\n");//如果号大于表长度,输出越界中段 else { printf("号=逻辑地址/面大小=%d,内地址=逻辑地址%面大小=%d\n",P,d);//输出号和内地址 kd=PT[P];//根据号随机产生快号 printf("根据号%d得到块号%d\n",P,kd); WD=kd*L+d;//计算物理地址的公 printf("物理地址=块号%d*面大小%d+内地址%d\n",kd,L,d);//输出物理地址=块号*面大小+内地址 printf("逻辑地址%d换算后的物理地址为%d\n\n",A,WD);//输出物理地址的结果 return (0); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值