Kiprey / Kiprey.github.io

This is Kiprey‘s Blog.
https://kiprey.github.io/
4 stars 3 forks source link

uCore实验 - Lab2 | Kiprey's Blog #40

Open Kiprey opened 4 years ago

Kiprey commented 4 years ago

https://kiprey.github.io/2020/08/uCore-2/

一个充满无尽乐趣的blog

Jiang-Le commented 2 years ago
// 将空闲页面按地址大小插入至链表中
for(le = list_next(&free_list); le != &free_list; le = list_next(le))
{
    p = le2page(le, page_link);
    if (base + base->property <= p) {
        assert(base + base->property != p);
        break;
    }
}
list_add_before(le, &(base->page_link));

实验2 default_free_pages 的修改这里应该有点问题? 释放内存后,需要将地址连续的内存块合并,但这里并没有合并,只是按顺序找到位置插入了进去。

Kiprey commented 2 years ago

@Jiang-Le

// 将空闲页面按地址大小插入至链表中
for(le = list_next(&free_list); le != &free_list; le = list_next(le))
{
    p = le2page(le, page_link);
    if (base + base->property <= p) {
        assert(base + base->property != p);
        break;
    }
}
list_add_before(le, &(base->page_link));

实验2 default_free_pages 的修改这里应该有点问题? 释放内存后,需要将地址连续的内存块合并,但这里并没有合并,只是按顺序找到位置插入了进去。

这是因为源码中早已实现了页面合并的逻辑,因此这里只是贴出了要修改的部分。

这里附上 default_pmm 源码,其中 #if 0 为原始逻辑,#else 为修改后的逻辑。

PointerToC commented 1 year ago

练习2的代码,有个问题:

// 获取传入的线性地址中所对应的页目录条目的物理地址  
pde_t *pdep = &pgdir[PDX(la)];

在源码的关于函数get_pte()的参数注释中,pgdir指的是PDT的内核虚地址。 &pgdir[PDX(la)]返回不应该也是内核虚地址吗?

Kiprey commented 1 year ago

@PointerToC 练习2的代码,有个问题: // 获取传入的线性地址中所对应的页目录条目的物理地址 pde_t *pdep = &pgdir[PDX(la)]; 在源码的关于函数get_pte()的参数注释中,pgdir指的是PDT的内核虚地址。 &pgdir[PDX(la)]返回不应该也是内核虚地址吗?

有可能是文档里不小心多打了 “物理” 二字。原始代码中没有额外突出是物理地址。

PointerToC commented 1 year ago

@PointerToC 练习2的代码,有个问题: // 获取传入的线性地址中所对应的页目录条目的物理地址 pde_t *pdep = &pgdir[PDX(la)]; 在源码的关于函数get_pte()的参数注释中,pgdir指的是PDT的内核虚地址。 &pgdir[PDX(la)]返回不应该也是内核虚地址吗?

有可能是文档里不小心多打了 “物理” 二字。原始代码中没有额外突出是物理地址。

OK,那没问题了