⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 6

📁 一个用于学习的操作系统
💻
字号:
目前的内存管理还是很简陋的。对页的管理也只是用了u8类型的数组(mem_map)对页进行引用计数,在实现方面也只有
//取得一个空闲页,返回页号
int get_free_page()
//释放一页,addr为逻辑地址
int free_page(u32 addr)
//获取一个空闲页映射到当前进程的addr地址处
s32 put_page(addr_t addr)

//取得一个空闲页,返回页号
int get_free_page()
{
    int i;
    for (i = mem_start_index; i < sizeof(mem_map); ++i) {
        if (! mem_map[i]) {     //如果引用计数为0,则表示页没有被使用
            mem_map[i] = 1;     //设置引用数为1
            printk("get_free_page index:%d\n", i);
            return i;           //返回页号
        }
    }
    return 0;
}

//释放一页,addr为逻辑地址
int free_page(u32 addr)
{
    int index;
    printk("free_page:%XH", addr);
    if (addr & 0x00000FFF) {
        //如果要释放的页不在4k边界上则死机
        char sztmp[128] = {0};
        sprintf(sztmp, "free_page addr: %d", addr);
        panic(sztmp);
        return 0;
    }
    
    index = paddr_to_index(vaddr_to_paddr(addr));   //根据逻辑地址转为页号
    if (! mem_map[index]) {     
        //如果待释放的页没有占用,则死机
        char sztmp[128] = {0};
        sprintf(sztmp, "free_page addr not used: %d", addr);
        panic(sztmp);
        return 0;
    }
    mem_map[index] = 0;         //设置页面引用数为0
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -