我正在尝试了解虚拟内存分页。我有以下代码片段,代表了该过程的第一步。这里从主程序为每个逻辑地址调用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;
}
答案 0 :(得分:2)
我能看到的唯一真正的问题是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)