调用流程如下
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

初始化过后的内存情况

default_alloc_pages

接受一个 参数size_t n 需要分配的页数
if(n > nr_free){
return NULL;// 如果当前的空余页数 已经不够了 就返回NULL
}

阅读注释

首先了解 list list.h 中的接口
使用 list_init list_add list_add_before list_del list_next list_prv

tricky method that is to transform a genera list struct to special struct
le2page
(2):
default 可是重用提供的 defalut_init
并且设置 nr_free =0

default_init_memmap :
设置page 的property 位,这意味这个page 是有效的

p->property 如果是首个空闲页的话 设置为空闲位的总大小 ,否则设置为0

p->ref 如果等于0 那么就说明 p 是free 的了

我们可以使用 p->page_link 将一个页插入 free_list 中,
list_add_before(&free_list,&(p->page_link)); 插入一整块的时候需要进行 nr_free+=n
efault_alloc_pages:

default_free_pages 的逻辑

接受一个基址 一个size_t n

循环n个pages 对于每一个Pages 要注意的是不一定是 分配时候的哪一个 首页
断言 PageProperty 与 Reservered 字段都是 0 (保证不会释放 未分配的空间)
清空 flag ref 字段 为0

设置这个 base 的property = n
setpropert

遍历整个free_list 找到和这个段相邻的其他段 进行合并(具体来说就是 前相连和后相连)

然后要找到正确的位置插入经过合并的内存页段

Lab1 ex1 物理页内存分配算法的实现的更多相关文章

  1. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  2. linux内核内存分配(三、虚拟内存管理)

    在分析虚拟内存管理前要先看下linux内核内存的具体分配我開始就是困在这个地方.对内核内存的分类不是非常清晰.我摘录当中的一段: 内核内存地址 ============================ ...

  3. JVM(3) 垃圾回收器与内存分配策略

    文章内容摘自:深入理解java虚拟机 第三章   对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  4. JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)

    一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...

  5. [development][dpdk][hugepage] 为不同的结点分配不同大小的大页内存

    这个事来自dpdk, 所以, 先参考. http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html 当前, 假设你已经读过上边内容, 知道大页内存时候, dp ...

  6. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...

  7. <转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明

    这篇文章看后感觉不错,和我在glibc下的hurdmalloc.c文件里关于malloc的实现基本意思相同,同时,这篇文章还介绍了一些内存管理方面的知识,值得推荐. 原文链接地址为:http://ww ...

  8. Linux内存分配小结--malloc、brk、mmap【转】

    转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...

  9. 深入理解Linux内存分配

    深入理解Linux内存分配 为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化.除此 ...

随机推荐

  1. 17多校6 HDU - 6102

    题意:给一个排列p,m次查询l,r,\(\sum_{i=l}^r\sum_{j=i+1}^r\sum_{k=j+1}^r[gcd(p_i,p_j)==p_k]p_k\) 题解:离线,枚举右端点,对于每 ...

  2. TokuDB安装

    安装TokuDB 1, 创建mysql数据目录 #顺便把临时目录创建好 mkdir -p /data/mysql/tmp groupadd -r mysql useradd -g mysql -r - ...

  3. 解决git每次输入密码,设置gitlab、github默认push的用户名和密码

    git ssh key配置&解决git每次输入密码   欢迎加入qq群(IT-程序猿-技术交流群):757345416 在使用git时,每次pull/push都需要输入密码,有时大大降低了我们 ...

  4. Spring MVC(十一)--使用字符串实现重定向

    Spring MVC中有两种重定向方式: 通过返回字符串,字符串必须以redirect:开头: 通过返回ModelAndView: 重定向的时候如果需要给重定向目标方法传参数,要分字符串参数和pojo ...

  5. css设置字体小于12px

    p { white-space: nowrap; font-size: .12rem; -webkit-transform-origin-x: 0; //缩小后文字居左 -webkit-transfo ...

  6. MySQL5.6 community从下载到安装

    一, 官网下载: https://www.mysql.com/downloads/      二, 安装过程 1, 双击打开 安装 这里是进行数据库配置: 端口默认为3306 这里我们更改为1207 ...

  7. Android开发 Camera2开发_1_拍照功能开发

    介绍 google已经在Android5.1之后取消了对Camera1的更新,转而提供了功能更加强大的Camera2.虽然新版本依然可以使用Camera1但是,不管是各种机型适配还是拍照参数自定义都是 ...

  8. NOIP2017普及组翻车记

    我就是一个这么个人:平常训练好好的,一到考场就炸. 不管是NOIP还是考试都是这样. 比赛时我脑抽,第二题相减后,居然一点一点地模10. 后来觉得很慢,用近乎一个小时时间,打了另一个方法(不是字典树, ...

  9. Django项目:CMDB(服务器硬件资产自动采集系统)--10--06CMDB测试Linux系统采集硬件数据的命令05

    cd /py/AutoClient/bin python3 auto-client.py /usr/local/python3/bin/pip install requests python3 aut ...

  10. Codec入门

    Codec 提供了一些公共的编解码实现,比如Base64, Hex, MD5等等. 工具类 package com.cxl.beanutil.util; import org.apache.commo ...