分页地址变换
需求分析
某系统程序空间与物理空间都是2GB,页面大小为4KB。已知某进程的页表如下,请编写程序模拟分页系统的地址变换过程。要求分为公式法和硬拼法两种方式计算并对比。
Pno Fno
0 32102
1 443217
2 6723
3 8985
4 11238
5 29065
6 234205
7 45812
8 240561
9 300451
程序设计思路、
下面的图说明了上面页表的作用(表左边用户程序对应了逻辑地址,右边内存对应着物理地址):
来自网络
其中2GB的程序以及4KB的页面可以知道,该程序需要512K个页号来储存,但是题目中只给出了1~10的页号,所以本程序只针对1~10的页号进行转换。
程序关键代码及解释
- 公式法求物理地址关键代码
//公式法
int fromualWay(int Pagecount){
//PageSize=4096;
//Pagecount为传入逻辑页号
int Pb = Pagecount/pageSize; //计算页号
int W = Pagecount%pageSize; //计算块内偏移量
int address; //储存物理地址
address = p[Pb]*pageSize + W;
return address; //返回物理地址
}
- 硬拼法求物理地址关键代码
void SpiltWay(char *str){
//str为逻辑地址转换为二进制的字符串
char pt[20]; //储存32到12位的2进制代码
int i;
int value;
for(i=0;i<=19;++i){ //初始化页号
pt[i] = str[i];
}
value = BinaryToDecimal(pt,20);//将页号对应的十进制赋值给value
value = p[value]; //value取得页号对应的块号
DecimalToBinary(value, str,20);//将str前20位的值替换为value
}
3.辅助操作函数
//二进制转十进制
int BinaryToDecimal(char* str,int bitCount)
{
int n=0;
int i=0;
int x=bitCount;
while(bitCount-i!=0)
{
if(str[x-1]=='1')
n += 1 *pow((double)2,(double)i);
i++;
x--;
}
return n;
}
//十进制转二进制
void DecimalToBinary(int x,char *str,int bit)
{
int i,k;
//char *str=new char[bitCount];
for(i=0;i<bit;i++)
{
str[i]='0';
}
//str[BitCount] = '\0';
k=i-1;
while(1)
{
if( x%2 == 1)
str[k] = '1';
//str[k]=(char)(x%2+48);
k--;
if(x/2==0)
{
break;
}
x=x/2;
}
}
void SubStr(char *Str2, char *Str1,int begin, int end){
int i;
for(i = begin;i<=end;i++){
Str2[i] = Str1[i];
}
}
4 程序源码及运行结果
#include<stdio.h>
#include<math.h>
#include<string.h>
#define BitCount 32
#define pageSize 4096
#define MaxSize 40960//页号的最大值
int p[10] = {32102,443217,6732,8985,11238,29065,234205,45812,240561,300451};
//初始化页表
//公式法
int fromualWay(int Pagecount){
int Pb = Pagecount/pageSize; //计算页号
int W = Pagecount%pageSize; //计算块内偏移量
int address; //储存物理地址
address = p[Pb]*pageSize + W;
return address;
}
int BinaryToDecimal(char* str,int bitCount)
{
int n=0;
int i=0;
int x=bitCount;
while(bitCount-i!=0)
{
if(str[x-1]=='1')
n += 1 *pow((double)2,(double)i);
i++;
x--;
}
return n;
}
void DecimalToBinary(int x,char *str,int bit)
{
int i,k;
//char *str=new char[bitCount];
for(i=0;i<bit;i++)
{
str[i]='0';
}
//str[BitCount] = '\0';
k=i-1;
while(1)
{
if( x%2 == 1)
str[k] = '1';
//str[k]=(char)(x%2+48);
k--;
if(x/2==0)
{
break;
}
x=x/2;
}
}
void SpiltWay(char *str){
//str为逻辑地址转换为二进制的字符串
char pt[20]; //储存32到12位的2进制代码
int i;
int value;
for(i=0;i<=19;++i){ //初始化页号
pt[i] = str[i];
}
value = BinaryToDecimal(pt,20);//将页号对应的十进制赋值给value
value = p[value]; //value取得页号对应的块号
DecimalToBinary(value, str,20);//将str前20位的值替换为value
}
void SubStr(char *Str2, char *Str1,int begin, int end){
int i;
for(i = begin;i<=end;i++){
Str2[i] = Str1[i];
}
}
int main(){
int PageCount;
int address;
int i;
char str1[32];
printf("请输入合法指令码:");
scanf("%d",&PageCount);
address = fromualWay(PageCount);
DecimalToBinary(PageCount,str1,32);
SpiltWay(str1);
i = BinaryToDecimal(str1,BitCount);
printf("公式法得物理地址为:%d\n",address);
printf("硬拼法得物理地址为:%d\n",i);
for(i=0;i<sizeof(str1);++i){
printf("%c",str1[i]);
}
}
运行结果
小结
本次作业,起初不太了解题意,又回去翻书,并没有翻倒自己想要的,真的是上课10分钟,下课一小时。。。。。