OS开发之底层内存管理笔记

本文探讨了64位操作系统中内存管理的具体实现方案。通过使用红黑树管理空闲内存,并采用位图记录已用内存的方式,解决了内存管理中的关键问题。同时,文章还讨论了在实际操作过程中遇到的一些挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  操作系统从BIOS的int 15h,ax = 0E820h子功能获得64位系统内存表(system memory map)后,需要对可用的内存进行管理,即建立一些数据结构用来记录已用的和空闲的内存,从而为后续的内存的申请使用和释放做准备。

  考虑到内存的空间有限,为了尽量减小内存管理数据结构所占的额外空间,我决定用IA32架构的小页面大小4KB为粒度管理内存。

  由于对内存的申请和释放是随机的,所以必须使用链表、树等数据结构而不能使用线性表。又由于对内存的访问十分频繁,所以应该尽量避免在内存管理时使用链表这种遍历时间复杂度为O(n) 的数据结构。出于这样的考虑,我决定选择红黑树作为记录空闲内存的数据结构,红黑树节点中的信息理所当然地可以放在空闲内存当中。

  为了申请特定大小内存和释放内存时合并邻近空闲内存的方便,我建立了以地址为关键字(key)和以空间大小为关键字的两棵红黑树。在申请特定大小内存时,为了尽量避免碎片,先从大小红黑树中寻找大小刚好匹配的节点,若找不到,再从大小最大的节点分配。这时可能出现两种情况:若需要的大小比最大的节点还大,那么还需要重复上述步骤;若需要的大小比最大的节点小,那么需要分割最大的节点。

  而在记录已用内存的问题上,我貌似遇到了大麻烦。目前我有两种思路。首先我想到也用红黑树来记录已用内存,但是这些已用内存红黑树节点不能放在申请得到的内存中,因此需要另外申请内存来存放这些节点,这就使情况变得非常复杂。不仅可能陷入存放节点和申请内存的循环中,而且还有管理已用内存红黑树节点这种已用内存的麻烦。

  然后我想到用位图来管理。但是还是有不小的麻烦:位图存放在哪,如何解决OS可用内存不连续的问题。一个4KB页面的位图最多只能记录128MB的内存的使用情况。对于越来越大的内存,位图的大小很可能超过一段OS可用内存区域的大小,这就会让位图不连续而需要使用链表来组织位图,从而又增加了位图大小的不确定性。

  若利用分页来将不连续的内存区域映射为连续,则在访问I/O映射内存或显存这种OS不可用内存时就会出现麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值