跟我一起写操作系统

    返回首页    发表留言
本文作者:李德强
          第二节 申请内存页
 
 

        实现内存页申请和释放函数alloc_page和free_page,也就是说这两个函数可以让程序向操作系统内核动态申请内存,并以4096B为一个页面来申请。

/*
 * alloc_page : 申请内存页,每页为4KB大小
 *  - int count : 页数
 * return : void*返回申请地址,NULL代表申请失败
 */
void* alloc_page(u32 process_id, u32 count, u32 can_swap, u32 is_dynamic)
{
	//查找内存申请地址
	void *ret = NULL;
	//找到空闲内存页计数
	u32 num = 0;
	//开始编号
	u32 start_with = 0;
	//从未被分配内存页的地方开始查找
	for (u32 i = MMAP_USED_SIZE; i < MAP_SIZE; i++)
	{
		//如果找到空闲页
		if ((mmap[i] & 0x1) == MM_FREE)
		{
			//设置可分配内存起始编号
			if (start_with == 0)
			{
				ret = (void*) (i * MM_PAGE_SIZE);
				start_with = i;
			}
			num++;
		}
		//如果没有找到空闲页
		else
		{
			//清空变量
			ret = NULL;
			num = 0;
			start_with = 0;
		}
		//找到了可分配内存页,并且找到了预期想要分配的数量
		if (start_with != 0 && num >= count)
		{
			break;
		}
	}
	//设置map的各个内存页的状态为已使用
	for (u32 i = 0; i < count; i++)
	{
		mmap[start_with + i] = MM_USED | MM_CAN_SWAP; //(MM_USED | ((u32) can_swap << 1) | ((u32) is_dynamic << 2));
		map_process[start_with + i] = process_id;
	}

	//返回查找到内存地址
	return ret;
}

        释放已经分配的多个内存页:

/*
 * alloc_page : 释放内存页,每页为4KB大小
 *  - void *addr : 释放地址
 *  - int count : 释放页数
 * return : void
 */
void free_page(void *addr, u32 count)
{
	//释放内存页
	for (u32 i = 0; i < count; i++)
	{
		//更新map中这些页的状态
		mmap[(u32) (addr + (i * MM_PAGE_SIZE)) / MM_PAGE_SIZE] = (MM_FREE | MM_CAN_SWAP | MM_NO_DYNAMIC);
		map_process[i] = 0;
	}
}

    返回首页    返回顶部
#1楼  .。。  于 2017年11月09日23:23:19 发表
 
这两段代码有什么区别吗?
#2楼  李德强  于 2017年11月11日12:02:06 发表
 
非常感谢您的提醒,代码粘贴错了,已经改正。
#3楼  Jackson  于 2019年10月27日10:59:58 发表
 
分配内存那个代码是有bug的。假设内存只有最后两个页是没有使用的,但是需要申请3个页或者更多,即使不满足申请条件,还是把非空地址返回出去了。
  看不清?点击刷新

 

  Copyright © 2015-2023 问渠网 辽ICP备15013245号