Open Kiprey opened 4 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 的修改这里应该有点问题? 释放内存后,需要将地址连续的内存块合并,但这里并没有合并,只是按顺序找到位置插入了进去。
@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
为修改后的逻辑。
练习2的代码,有个问题:
// 获取传入的线性地址中所对应的页目录条目的物理地址
pde_t *pdep = &pgdir[PDX(la)];
在源码的关于函数get_pte()的参数注释中,pgdir指的是PDT的内核虚地址。 &pgdir[PDX(la)]返回不应该也是内核虚地址吗?
@PointerToC 练习2的代码,有个问题:
// 获取传入的线性地址中所对应的页目录条目的物理地址 pde_t *pdep = &pgdir[PDX(la)];
在源码的关于函数get_pte()的参数注释中,pgdir指的是PDT的内核虚地址。 &pgdir[PDX(la)]返回不应该也是内核虚地址吗?
有可能是文档里不小心多打了 “物理” 二字。原始代码中没有额外突出是物理地址。
@PointerToC 练习2的代码,有个问题:
// 获取传入的线性地址中所对应的页目录条目的物理地址 pde_t *pdep = &pgdir[PDX(la)];
在源码的关于函数get_pte()的参数注释中,pgdir指的是PDT的内核虚地址。 &pgdir[PDX(la)]返回不应该也是内核虚地址吗?有可能是文档里不小心多打了 “物理” 二字。原始代码中没有额外突出是物理地址。
OK,那没问题了
https://kiprey.github.io/2020/08/uCore-2/
一个充满无尽乐趣的blog