📄 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 + -