实现内存页申请和释放函数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;
}
}
Copyright © 2015-2023 问渠网 辽ICP备15013245号