实现内存页申请和释放函数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号