オペレーティングシステムプログラミング操作アナログページングシステムの5アドレス変換(式メソッドとハードスペルメソッド)(C ++実装)

タイトル

ページングシステムでは、プログラム領域と物理領域はどちらも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

元の9件の記事を公開 いいね2 訪問559

おすすめ

転載: blog.csdn.net/qq_40939814/article/details/103548645