对fixmap实现动态内存申请的理解

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

本文谈谈内核初始话过程中是如何利用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申请页对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值