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
初始化过后的内存情况

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 物理页内存分配算法的实现的更多相关文章
- Linux内核笔记--内存管理之用户态进程内存分配
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...
- linux内核内存分配(三、虚拟内存管理)
在分析虚拟内存管理前要先看下linux内核内存的具体分配我開始就是困在这个地方.对内核内存的分类不是非常清晰.我摘录当中的一段: 内核内存地址 ============================ ...
- JVM(3) 垃圾回收器与内存分配策略
文章内容摘自:深入理解java虚拟机 第三章 对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- [development][dpdk][hugepage] 为不同的结点分配不同大小的大页内存
这个事来自dpdk, 所以, 先参考. http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html 当前, 假设你已经读过上边内容, 知道大页内存时候, dp ...
- 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,GC),大部分人都把这 ...
- <转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明
这篇文章看后感觉不错,和我在glibc下的hurdmalloc.c文件里关于malloc的实现基本意思相同,同时,这篇文章还介绍了一些内存管理方面的知识,值得推荐. 原文链接地址为:http://ww ...
- Linux内存分配小结--malloc、brk、mmap【转】
转自:https://blog.csdn.net/gfgdsg/article/details/42709943 http://blog.163.com/xychenbaihu@yeah/blog/s ...
- 深入理解Linux内存分配
深入理解Linux内存分配 为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化.除此 ...
随机推荐
- Python-线程(1)
目录 什么是线程 进程与线程的区别 开启线程 为什么要使用线程 线程之间数据是共享的 什么是线程 线程与进程都是虚拟单位,目的是为了更好的描述某种事物 进程与线程的区别 进程:资源单位 线程:执行单位 ...
- 最新MySQL5.7.3.0版本安装(图文版本)
转自:http://www.myexception.cn/mysql/1609536.html 可以从http://dev.mysql.com/downloads/下载MySQL服务器安装软件包,我下 ...
- poi 3669 meteor shower (bfs)
题目链接:http://poj.org/problem?id=3669 很基础的一道bfs的题,然而,我却mle了好多次,并且第二天才发现错在了哪里_(:з)∠)_ 写bfs或者dfs一定要记得对走过 ...
- Linux CentOS CapsLock 大小写反转问题 解决
虚拟机centos7,输入大小写字母反了,开启capslock的时候变成小写字母了,关闭则变成大写了... 只需要执行 setleds +caps 或 setleds -caps 即可,如图:
- [自学]数据库ER图基础概念整理(转)
ER图分为实体.属性.关系三个核心部分.实体是长方形体现,而属性则是椭圆形,关系为菱形. ER图的实体(entity)即数据模型中的数据对象,例如人.学生.音乐都可以作为一个数据对象,用长方体来表示, ...
- .NET Framework的属性类对控件的支持功能
ToolBoxItem 此属性为类特性.属于工具箱属性,可以设置当前控件是否在工具箱中显示,以及所在工具箱项的类型名称等信息.默认生成的控件都显示在工具箱中. 更多设计时属性介绍: 4.3 属性的 ...
- 从0开始学习ssh之日志工具与配置log4j
添加slf4j-api-1.6.1,slf4j-log4j12-1.6.1,log4j-1.2.15三个jar包到lib文件夹下就可以使用log4j日志文件.具体配置在log4j.properties ...
- drools跳转出现错误问题(400)
400 Sorry, a technical error occurred. Please contact a system administrator. 今天drools的管理平台tomcat部署完 ...
- double转integer
double id0 = row.getCell(0).getNumericCellValue(); Integer id = Integer.valueOf(Double.valueOf(id0). ...
- Android 开发 Camera2开发_3_处理预览和拍照偏暗问题
通过调整曝光解决 参考:https://stackoverflow.com/questions/28429071/camera-preview-is-too-dark-in-low-light-and ...