Lab1 ex1 物理页内存分配算法的实现

调用流程如下
kern_init --> pmm_init-->page_init-->init_memmap--> pmm_manager->init_memmap
从page_init 说起

先找到 e820map 这个数据结构 读取BISO 设置好的可用内存空间

将空闲内存的最后一个地址分配给 maxpa

如果maxpa 最大为 KMEMSIZE

npage= maxpa / PGSIZE 计算总共的页数量

end 作为kernel 的结束 向高位 对其 PGSIZE
作为 pages的起始地址

从pages 开始向后 分配 npage 个空闲的端 进行 SetPageReserved
freemem 就等于 pages+npage*sizeof(page) 进行 PADDR 后的到 实际的物理地址起始的空闲内存地址

换句话说 就是pages 仍然存贮逻辑地址

对于每一个空闲的内存块, 开始地址最小不能小于 freemem 最大不能大于 KMEMSIZE(考虑到从0开始?)

将 begin 和 end 分别向上向下 与 PGSIZE 对其
执行 init_memmap(pa2page(begin),(end-begin)/PGSIZE)

pa2page 取出物理的前22位当作索引 到pages[ppn(pa)] 取出对应的页表首地址

而其中的 init_memmap 接受一个 Page*base size_t n
调用pagememger - initmap 方法对页表条目进行初始化

下面我们看一个 default_meminit 的行为

初始化 从Base 开始的 n个页表条目
首先
assert(PageRserved(p)) 认为我要初始化的页表是可以初始化的 前面进行过初始化了(这里是确认?)

p->flags = p-> property=0 设置pages 相关属性

set_page_ref(p,0) 清零引用

nr_free +=n 多出来了n 个可用的内存空间?

base-> property = n 这个用于 first_fit 策略

SetPageProperty(base)

init_pmm_manager 是 指定了 使用的内存分配器位default

初始化过后的内存情况

猜你喜欢

转载自www.cnblogs.com/sfzyk/p/9036794.html
ex1
今日推荐