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

|| 我正在尝试了解虚拟内存分页。我有以下代码片段代表了流程的第一步。在此,从主程序为每个逻辑地址调用“ 0”,以检查页表是否已经具有将提供的逻辑地址映射到物理内存中某个位置的条目。
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
。考虑一下,这可能是一个主要问题,如果页表确实是指向页表条目的指针数组。另外,如果“ѭ6”,则您没有为表分配足够的空间。 另一个问题可能是“ 7”。通常的做法是对n位整数类型的位进行编号,其中0为最低有效位,n-1为最高有效位。如果“ 7” 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)
    

要回复问题请先登录注册