Skip to content

Conversation

houmkh
Copy link
Collaborator

@houmkh houmkh commented Feb 28, 2023

No description provided.


  `free_regions`的下标(index)与内存块的大小有关。由于每个内存块大小都为$2^{n}$ bit,那么可以令$exp = n$。index与exp的换算公式如下:$index = exp - 12$。e.g. 一个大小为$2^{12}$ bit的内存块,其$exp = 12$,使用上述公式计算得$index = 12 -12 = 0$,所以该内存块会被存入`free_regions[0].list`中。通过上述换算公式,每次取出或释放$2^n$大小的内存块,只需要操作`free_regions[n -12]`即可。DragonOS中,buddy内存池最大的内存块大小为$1G = 2^{30}bit$,最小的内存块大小为 $4K = 2^{12} bit$,所以$index\in[0,18]$。

  作为内存分配机制,buddy服务于所有进程,为了解决在各个进程之间实现free_regions中的链表数据同步的问题,`free_regions`中的链表类型采用加了[自旋锁 — DragonOS dev 文档](https://docs.dragonos.org/zh_CN/latest/kernel/locking/spinlock.html#spinlock)(SpinLock)的空闲内存块链表(MmioFreeRegionList),`MmioFreeRegionList`中封装有真正的存储了空闲内存块信息的结构体的链表(list)和对应链表长度(num_free)。有了自选锁后,同一时刻只允许一个进程修改某个链表,如取出链表元素(申请内存)或者向链表中插入元素(释放内存)。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fslongjin fslongjin merged commit c248145 into DragonOS-Community:master Mar 4, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants