3

仮想メモリのページングを理解しようとしています。プロセスの最初のステップを表す次のコード スニペットがあります。ここでsearch_tblは、提供された論理アドレスを物理メモリ内の場所にマップするエントリがページ テーブルに既にあるかどうかを確認するために、各論理アドレスのメイン プログラムから呼び出されます。vfn仮想フレーム番号です。

編集済み: この実装は意味がありますか? それとも間違った道を進んでいますか?

どんな助け/提案も大歓迎です。ありがとうございました。

uint vfn_bits;//virtual frame number
static tbl_entry **tbl;
uint page_bits = log_2(pagesize);
vfn_bits = addr_space_bits - page_bits;
tbl = calloc(pow_2(vfn_bits), sizeof (tbl_entry*));

tbl_entry *search_tbl(uint vfn) {

    uint index = vfn;
    if (tbl[index] == NULL) {
        /* Initial miss */
        tbl[index] = create_tbl_entry(vfn);
    }
    return tbl[index];
}

tbl_entry *create_tbl_entry(uint vfn) {
    tbl_entry *te;
    te = (tbl_entry*) (malloc(sizeof (tbl_entry)));

    te->vfn = vfn;
    te->pfn = -1;
    te->valid = FALSE;
    te->modified = FALSE;
    te->reference = 0;

    return te;
}
4

1 に答える 1

2

私が見ることができる唯一の実際の問題は、search_tbl()戻り値の型がtbl_entry*であるが、実際には を返していることtbl_entryです。ただし、ページテーブルが実際にページテーブルエントリへのポインターの配列である場合、それは大きな問題になる可能性があります。また、sizeof(tbl_entry) > sizeof(tbl_entry*)テーブルに十分なスペースを割り当てていない場合。

別の問題が考えられますgetbits()。最下位ビットを 0、最上位ビットを n - 1 として、n ビット整数型のビットに番号を付けるのが通常の方法です。APIの場合はgetbits()、アドレスの間違った部分に基づいてインデックスを計算しています。

編集

上記は、編集された質問のコードの元のバージョンに当てはまりました。

コメントの getbits の質問に関しては、以下が使用されている場合 (32 ビット アドレスを想定)

uint32_t getbits(uint32_t x, unsigned int p, unsigned int n)
{
    return (x >> (p + 1-n)) & ~(~0 << n);
}

これは、最上位ビットが最も高い番号のビット、つまりビット 31 が最上位ビットであると想定しています。したがって、ページ サイズを 4096 バイトと仮定すると、アドレスのフレーム番号は次のように取得できます。

vfn = getbits(x, 31, 20); // 31 is the top bit, number of bits is 32 - log2(4096)
于 2011-04-13T16:31:13.467 に答える