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(). 通常的做法是对 n 位整数类型的位进行编号,其中 0 作为最低有效位,n - 1 作为最高有效位。如果 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 回答