了解分页虚拟内存的第一步:在初始缺页时创建页表条目

发布于 2024-11-01 05:53:46 字数 857 浏览 0 评论 0原文

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

I am trying to understand virtual memory paging. I have the following code snippet that represents the first step in the process. Here search_tbl is called from the main program for each logical address in order to check if the page table already has an entry that maps the provided logical address to a location in physical memory. vfn is the virtual frame number.

EDITED:
Does this implementation make any sense? Or am I going down the wrong road?

Any help/suggestion would be greatly appreciated. Thank you.

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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

自控 2024-11-08 05:53:46

我能看到的唯一真正的问题是 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)

The only real issue I can see with it is that search_tbl()'s return type is tbl_entry* but it is actually returning a tbl_entry. That could be a major issue though, thinking about, it if the page table is really an array of pointers to page table entries. Also, if sizeof(tbl_entry) > sizeof(tbl_entry*) you are not allocating enough space for the table.

Another issue might be getbits(). It's normal practice to number the bits of an n-bit integer type with 0 as the least significant bit and n - 1 as the most significant bit. If that is the case for the getbits() API, you are calculating the index based on the wrong part of the address.

Edit

The above was true for the original version of the code in the question which has been edited out.

As for the getbits question in the comment, if the following is used (assuming 32 bit addresses)

uint32_t getbits(uint32_t x, unsigned int p, unsigned int n)
{
    return (x >> (p + 1-n)) & ~(~0 << n);
}

That assumes that the most significant bit is the one with the highest number i.e. bit 31 is the highest bit. So, if you assume a page size of 4096 bytes, the frame number of an address can be obtained like this:

vfn = getbits(x, 31, 20); // 31 is the top bit, number of bits is 32 - log2(4096)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文