gpt4 book ai didi

c - 了解分页虚拟内存的第一步 : Creating Page Table Entry upon Initial Page Fault

转载 作者:行者123 更新时间:2023-12-02 02:03:24 27 4
gpt4 key购买 nike

我正在尝试了解虚拟内存分页。我有以下代码片段代表该过程的第一步。这里 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)

关于c - 了解分页虚拟内存的第一步 : Creating Page Table Entry upon Initial Page Fault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5651845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com