码迷,mamicode.com
首页 > 其他好文 > 详细

跟我一起写操作系统(五)——分配物理内存

时间:2015-12-20 22:11:53      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

转载注明出处:http://www.cnblogs.com/lucasysfeng/p/4847662.html

上一讲地址:http://www.cnblogs.com/lucasysfeng/p/5059767.html

项目地址:https://github.com/lucasysfeng/lucasOS

  

  上一讲我们获取到了物理内存,本讲我们来看如何分配物理内存。为简化问题,我们不使用伙伴内存分配算法,而是把可用内存按页存入栈中,每次分配从栈中取就可以了。

  本讲的主要代码在lib/pmm.c中,下面给出部分代码。本讲内容不多,读者看代码即可。

void init_pmm()
{
	mmap_entry_t *mmap_start_addr = (mmap_entry_t *) glb_mboot_ptr->mmap_addr;
	mmap_entry_t *mmap_end_addr = (mmap_entry_t *) glb_mboot_ptr->mmap_addr
			+ glb_mboot_ptr->mmap_length;

	mmap_entry_t *map_entry;

	for (map_entry = mmap_start_addr; map_entry < mmap_end_addr; map_entry++)
	{

		// type为1表示可用内存,其它指保留区域,参考上一讲的multiboot_t结构
		if (map_entry->type == 1 && map_entry->base_addr_low == 0x100000)
		{

			// 可用内存要减去内核本身占用的内存
			uint32_t page_addr = map_entry->base_addr_low
					+ (uint32_t) (kern_end - kern_start);
			uint32_t length = map_entry->base_addr_low + map_entry->length_low;

			while (page_addr < length && page_addr <= PMM_MAX_SIZE)
			{
				pmm_free_page(page_addr);
				page_addr += PMM_PAGE_SIZE;
				phy_page_count++;
			}
		}
	}
}

  

void pmm_free_page(uint32_t p)
{
	assert(pmm_stack_top != PAGE_MAX_SIZE, "out of pmm_stack stack\n");
	pmm_stack[++pmm_stack_top] = p;
}

  

代码获取


  本系列GitHub地址 https://github.com/lucasysfeng/lucasOS,本讲的代码是code/chapter5.

跟我一起写操作系统(五)——分配物理内存

标签:

原文地址:http://www.cnblogs.com/lucasysfeng/p/5061763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!