タイトル
ページングシステムでは、プログラム領域と物理領域はどちらも2GBであり、ページサイズは4KBです。
プロセスのページテーブルは以下の通りであることがわかっていますので、ページングシステムのアドレス変換プロセスをシミュレートするプログラムを書いてください。
要件は、式方式とハードスペル方式の 2つの方法に分かれており、2つの方法の違いを比較して体験できます。
要件:
(1)ユーザーが論理アドレスを入力し、プログラムが対応する物理アドレスを出力する
(2)ユーザーが入力する論理アドレスが10進数または16進数である
(3)出力物理アドレスが10進数または16進数である
(4)2つの方法の計算結果を比較して、それらが一致しているかどうかを確認します。
コード
//
// Created by Jintao on 2019/12/14.
//
// 题目:
// 某分页系统中,程序空间与物理空间都是2GB,页面大小为4KB。
// 已知某进程的页表如下,请编写程序模拟分页系统的地址变换过程。
// 要求分为公式法和硬拼法两种方式实现,并对比体会两种方法的差别。
// [图片]
//
// 要求:
//(1)用户输入逻辑地址,程序输出对应物理地址
//(2)用户输入的逻辑地址可以是十进制也可以是十六进制
//(3)输出的物理地址可以是十进制也可以是十六进制
//(4)两种方法的计算结果进行对比,看看是否一致。
#include<cstdio>
#include<cstring>
int blocks[10] = {
32102, 443217, 6723, 8985, 11238,
29065, 234205, 45812, 240561, 300451
};
const int pageSize = 4096; // 页面大小: B
const int pageNumLen = 20; // 页号
const int pageOffsetLen = 12; // 页内偏移量
const int physLength = pageNumLen + pageOffsetLen;
/// 公式法
int formulaMethod(int logicAddr);
/// 硬拼法
char *jointMethod(char *physAddrBin, int logicAddr);
// 进制转换,其中length 是指 字符串的长度,包含\0位
int __binToDec(const char *bin, int length);
char *__decToBin(char *destBin, int length, int dec);
int main() {
int logicAddr;
char physAddr[physLength + 1];
printf("logicAddr:\n");
scanf("%i", &logicAddr);
// get PhysAddr; 物理地址
printf("formulaMethod: %d\n", formulaMethod(logicAddr));
jointMethod(physAddr, logicAddr);
printf("jointMethod: 0b%s - %d\n", physAddr, \
__binToDec(physAddr, physLength + 1));
}
// ------------------------------------------------------- 函数定义
int __powi(int x, int n) {
int result = 1;
for (int i = 0; i < n; i++) {
result *= x;
}
return result;
}
int __binToDec(const char *bin, int length) {
int dec = 0;
// 1010 = 1*8+1*2; 1*2**3
for (int i = 0; i < length - 1; i++) {
dec += (bin[i] - '0') * __powi(2, length - 2 - i);
}
return dec;
}
char *__decToBin(char *destBin, int length, int dec) {
// 10 -> 1010; 10 /2%2 (5-0, 2-1, 1-0, 0-1); 1010
for (int i = length - 2; i > -1; i--) {
if (dec == 0) {
destBin[i] = '0';
continue;
}
destBin[i] = static_cast<char>(dec % 2 + '0');
dec /= 2;
}
destBin[length - 1] = '\0';
return destBin;
}
int formulaMethod(int logicAddr) {
int pageNum = logicAddr / pageSize; // 页号
int offset = logicAddr % pageSize; // 偏移
int blockNum = blocks[pageNum]; // 块号
// 物理地址 = 块号 * 块大小 + 偏移
return blockNum * pageSize + offset;
}
char *jointMethod(char *physAddrBin, int logicAddr) {
int pageNum = logicAddr / pageSize; // 页号
int offset = logicAddr % pageSize; // 偏移
int blockNum = blocks[pageNum]; // 块号
// 物理地址 = concat(bin(blockNum), bin(offset))
char BlockNumBin[pageNumLen + 1];
char offsetBin[pageOffsetLen + 1];
__decToBin(BlockNumBin, pageNumLen + 1, blockNum);
__decToBin(offsetBin, pageOffsetLen + 1, offset);
memcpy(physAddrBin, BlockNumBin, pageNumLen);
strcat(physAddrBin, offsetBin);
return physAddrBin;
}
運用実績
同じシリーズ
2.オペレーティングシステムプログラミングジョブ2プロセススケジューリング(C ++で実装)
https://blog.csdn.net/qq_40939814/article/details/103548436
3.オペレーティングシステムプログラミングジョブ3プロセス同期(セマフォメカニズム)(C ++疑似コード実装)
https://blog.csdn.net/qq_40939814/article/details/103548527
5.オペレーティングシステムのプログラミング操作アナログページングシステムの5アドレス変換(式メソッドとハードスペルメソッド)(C ++実装)
https://blog.csdn.net/qq_40939814/article/details/103548645