位图的内存管理

参考书籍:《操作系统 真象还原》 作者:郑钢
本章要解决的问题:创建一个类似malloc的函数。
想要动态的开辟内存空间,要解决一个问题:在哪里开辟空间。
内存空间,有的被使用,有的没有被使用。如果没有被使用的空间足够,则可以从中划分出来。
那如何分表某一部分内存是否被使用?
可以使用位图。用0表示没有使用,用1表示没有使用。(当然还有其他方法,比如说双向链表)

1byte 的位图空间可以映射 1 * 8 * 4KB = 32KB 的内存空间
那么 一页4096Bbyte 的位图空间就可以映射 32 * 4096 / 1024 = 128MB的内存空间
在这里插入图片描述
我们现在在保护模式之下。而且,每一位如果可以表示4k内存的使用情况,我们很容易想到,页表(虚拟地址)。每页大小也是4k。但是虚拟内存,不能真正反映内存的使用情况。因为不同的虚拟地址可以指向同一个物理地址。
那如果,让位图反映真实的内存使用情况。又如何保证每一次,虚拟地址指向的都是空闲的物理内存?
所以我们要结合起来。
1. 在虚拟内存池中申请n个虚拟页(有个位图表示虚拟内存)
2. 在物理内存池中分配物理页。(有个位图表示物理内存池)
3. 在页表中添加虚拟地址与物理地址的映射关系。
在这里插入图片描述

代码见:https://github.com/da1234cao/tiny-os/tree/master/chapter8
(最后一个映射代码没有看,脑袋疼)

参考文章:
1. 内存池规划
2. 跟我一起写Makefile
3. 常用 Git 命令清单

发布了104 篇原创文章 · 获赞 134 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/sinat_38816924/article/details/98380101