******
因为map空间申请的不够,少了一位,过不了diff,要申请256
*****
大家好,这里写一下我对操作系统第二次大作业,第一小题的个人理解。
首先搞明白一个程序,要先明白,输入和输出。
输入是虚拟地址,输出是物理地址和对应的存放在物理地址上的值。
那么核心的问题就是如何进行思路的转换。
虚拟地址,有课本上给出的定义我们知道,虽然他是一个整数,但是你可以将他进行转化成为16位的二进制码,然后取前八位和后八位,就是我们想要的页码和偏移量,下文均称为page和offSet。
代码方面要注意,c语言是要对数组进行初始化的,否则会出问题
int temp = addresses[i];
int count = 0;
int binary[100];
int l;
for(l = 0; l < 100; l++){
binary[l] = 0;
}
while(temp != 0){
binary[count] = temp & 1;
//这里相当于temp对000000001按位和,那么只有第一位为1的时候,才会是1,正好是我们想要的结果。
temp = (temp>>1);
count++;
//右移一位,相当于不要了,这里最好注意一下运算符优先级
}
//我们得到了二进制的数组,但是是反过来的,不过刚刚好,因为我们运算回去,也是要反过来运算。
//前8位不用关心,我们直接从第8位开始算,思路上文已经说了
int page = 0;//页号
page = binary_to_int(binary,8,16);
在上文中,我们获得了page和offSet,那么我们要得到frame和offSet,首先我们要知道在该题中,我们的offSet是不变的,那么我们解决了一半的问题。接下来就是page和frame这两者的关系。
重点来了,在第一问中,我们的虚拟地址和物理地址也就是page对frame是256对256的,也就是说没有说内存条(物理内存)不够用,需要进行置换的情况存在。
那么我们就直接可以用一个数据结构,记录下目前已经构建好的page-frame的对应关系,
然后如果说我们得到一个的page进行处理,那么我们要先去看刚才的数据结构,也就是页表。有没有对应关系,(之前有没有出现过),
- 如果之前出现过,好,那么我们就得到了frame
- 如果没有出现过,好,我们就从上到下,把还没有分配的frame分配给他