本文谈谈内核初始话过程中是如何利用fixmap来实现动态分配内存的。
关于fixmap的学习,可以参考这两份链接:
http://www.wowotech.net/memory_management/440.html
http://www.wowotech.net/memory_management/fixmap.html
物理地址的分配是由memblock来完成,但这不意味这就可以使用了,还需要申请虚拟地址,同时再建立页表完成映射,这样才能使用分配的内存。而建立页表又需要申请内存并建立映射,如此循环下去怎么完成工作?我提出这个疑问是因为我在阅读paging_init的代码时,对那里重新映射的代码非常疑惑,因为那里需要不断动态申请内存。
以early_pgtable_alloc的代码来分析它是如何完成的:
static phys_addr_t __init early_pgtable_alloc(void)
{
phys_addr_t phys;
void *ptr;
phys = memblock_alloc(PAGE_SIZE, PAGE_SIZE);
/*
* The FIX_{PGD,PUD,PMD} slots may be in active use, but the FIX_PTE
* slot will be free, so we can (ab)use the FIX_PTE slot to initialise
* any level of table.
*/
ptr = pte_set_fixmap(phys);
memset(ptr, 0, PAGE_SIZE);
pte_clear_fixmap();
return phys;
}
对于使用memblock_alloc申请页对

本文探讨内核启动过程如何运用fixmap进行动态内存分配,通过解析early_pgtable_alloc函数,揭示物理地址分配后,如何申请虚拟地址并建立页表映射,使内存可用。特别聚焦于使用fixmap解决映射循环问题,及其映射限制。
最低0.47元/天 解锁文章
736

被折叠的 条评论
为什么被折叠?



