这里稍微整理一下操作系统中进程逻辑地址到实际物理地址中的转换,可惜开始没注意到用的笔太细了,当然,本身写字也比较随意。
#include<iostream>
using namespace std;
#define sizeofPageTable 4 //这里就是 存储一个页地址用的大小,3B或者4B
#define sizeofPage 4096 //这里假设按照4096字节将物理空间分页
typedef struct pageTable {
char arr[sizeofPageTable];//便于理解,表示这个数据结构可人工设置大小
} *PageTable;
typedef struct pcb {
PageTable* PT; //一片连续的存储进程页表信息的空间
int lenOfPT; //PTR中的页表长度? 代表进程已分配的页的数量
} *PCB;
typdef struct pcr {
unsigned int addrOfStart; //进程在内存中的起始物理地址
int lenOfPT; //页表长度 代表进程已分配的页的数量
} *PCR;
int main()
{
unsigned int logicAddr = 0x123456; //随便写的
int pageIndex = logicAddr>>20; //pcb中PT数组的下标
int pageOff = logicAddr&(sizeofPage - 1); //即保留低位12bit,即为页内偏移地址
if(pageIndex >= PCR->lenOfPT)
{
printf("空间越界!该进程并没有分配这么多的空间!\n");
return -1;
}
//随便写的,只是便于理解;这里的前提是系统的物理地址为4GB,并且一个页面大小为4096B
int realAddr = PCR->addrOfStart + PCB->PT[pageIndex]*sizeofPage + pageoff;
}