1. 请求分页虚拟存储管理技术是把作业地址空间的全部信息存放在磁盘上。当作业被选中运行时,,先把作业的开始几页装入主存并启动运行。为此在为作业建立页表时,应说明哪些页已在主存,哪些页不在主存。
2. 作业执行时,指令中的逻辑地址指出参加运算的操作数 (或指令)地址中的页号和页内偏移量。硬件地址转换机构按页号查页表。
3. 设计一个“地址变换”程序,模拟硬件地址变化过程。当访问的页在主存时,则形 成绝对地址后,不去模拟指令的执行,而是输出被转换的地址。当访问的页不在主存时,输出“该页不在主存,产生缺页中断”以表示产生一次缺页中断。
4. 进行缺页中断处理。中断返回后,重新执行该指令。 假定主存的每块长度为 64个字节,现有一个具有 8 页的作业,系统为其分配了4个主存块(即m=4),且最多分 4 块。
Id | 页号 |
Flag | 标志 |
MemoryBlock | 主存块号 |
ChangePosition | 修改位 |
outAddress | 外存地址 |
地址转换代码(核心代码)
其中Block为逻辑地址对应的页表号码
Bias为偏移量
注意地址转换公式为:
绝对地址 = 块号 * 块的长度 + 页内偏移量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include<iostream> #include<deque> #include<cstdio> using namespace std; int blockSize = 64; struct page{ int id; int flag; int memoryBlock; int changePosition; int outAddress; }; deque<page> pageList; void initPageList(int pageSize){ struct page temp; for(int i=0;i<pageSize;i++){ temp.id=i; if(i<4){ temp.flag=1; }else{ temp.flag=0; } pageList.push_back(temp); } pageList[0].memoryBlock=5; pageList[1].memoryBlock=8; pageList[2].memoryBlock=9; pageList[3].memoryBlock=10; } void showPage(int id,int bias){ for(int i=0;i<pageList.size();i++){ if(pageList[i].id==id){ cout<<"具体信息:页面号"<<pageList[i].id<<" "<< "主存号: "<<pageList[i].memoryBlock<< "偏移量: "<<bias<<endl; break; } } } void transAddress(int logAddr){ int Block = logAddr/64; int bias = logAddr%64; int flag=0; for(int i=0;i<pageList.size();i++){ if(pageList[i].id==Block){ if(pageList[i].flag==1){ showPage(pageList[i].id,bias); int absAddr = pageList[i].memoryBlock*blockSize+bias; cout<<"被转换的物理地址为:"<<absAddr<<endl; flag = 1; break; } } } if(flag==0){ cout<<"该页不在主存,产生缺页中断。"<<endl; } } int main(){ int logAddr; int pageSize; cout<<"输入页表长度:"; cin>>pageSize; initPageList(pageSize); while(logAddr!=999){ cout<<"\n----请输入逻辑地址(999退出):"; cin>>logAddr; transAddress(logAddr); } cout<<"ok"<<endl; } |
实验设计
测试用例
逻辑地址为65、124、130、193、257
分别在主存号为5 8 9 10 不存在的位置
逻辑地址 | 主存号 |
63 | 5 |
124 | 8 |
130 | 9 |
193 | 10 |
257 | 页面中断 |
结果: