繁体   English   中英

理解分页虚拟内存的第一步:在初始页面错误时创建页表条目

[英]First Step in Understanding Paged Virtual Memory: Creating Page Table Entry upon Initial Page Fault

我试图了解虚拟内存分页。 我有以下代码片段,代表了该过程的第一步。 这里,从主程序为每个逻辑地址调用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;
}

我能看到的唯一真正的问题是search_tbl()的返回类型是tbl_entry*但它实际上返回了一个tbl_entry 这可能是一个主要问题,考虑一下,如果页表实际上是一个指向页表项的指针数组。 此外,如果sizeof(tbl_entry) > sizeof(tbl_entry*)您没有为表分配足够的空间。

另一个问题可能是getbits() 通常的做法是对n位整数类型的位进行编号,其中0表示最低有效位,n - 1表示最高有效位。 如果是getbits() API的情况,则根据地址的错误部分计算索引。

编辑

对于已经删除的问题中的代码的原始版本,上述情况属实。

至于评论中的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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM