change picture url

This commit is contained in:
gameloader 2022-04-05 21:54:43 +08:00
parent e194150881
commit 183b1963ff

View File

@ -64,7 +64,7 @@ UAF的根本成因在于攻击者可以重新声明被释放的内存并修改
### Metadata of Allocations {#metadata-of-allocations} ### Metadata of Allocations {#metadata-of-allocations}
该部分是为了实现这种内存分配所定义的数据结构。首先需要弄清楚几个结构之间的关系即pool,allocator,page,chunk。small被定义为less than half a page。其余为large。 该部分是为了实现这种内存分配所定义的数据结构。首先需要弄清楚几个结构之间的关系即pool,allocator,page,chunk。small被定义为less than half a page。其余为large。
![](https://images.gitee.com/uploads/images/2021/1115/230444_15dde024_8810712.png) ![](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/0405oUDNko.jpg)
### Freeing Memory {#freeing-memory} ### Freeing Memory {#freeing-memory}
@ -93,7 +93,8 @@ realloc 允许程序改变现有的已分配区块的区块大小,如果变小
### FCmalloc {#fcmalloc} ### FCmalloc {#fcmalloc}
FCmalloc是OTA最简单的实现方式处理内存请求时的内存分配一直是连续的内存页不够用就调用mmap分配新的内存页对于free请求只有当一整页的内存都被free才调用munmap释放该页。但是这种分配方式最严重的问题就是造成的系统开销过大。在gcc benchmark中对一个c-typeck的输入文件使用FCmalloc和glibc的malloc会产生60.2%的mmap munmap系统调用开销严重的内存开销还有对系统VMA结构的浪费。Linux限制每个进程最多创建65535个VMA结构体。下图显示了FCmalloc的VMA浪费情况 FCmalloc是OTA最简单的实现方式处理内存请求时的内存分配一直是连续的内存页不够用就调用mmap分配新的内存页对于free请求只有当一整页的内存都被free才调用munmap释放该页。但是这种分配方式最严重的问题就是造成的系统开销过大。在gcc benchmark中对一个c-typeck的输入文件使用FCmalloc和glibc的malloc会产生60.2%的mmap munmap系统调用开销严重的内存开销还有对系统VMA结构的浪费。Linux限制每个进程最多创建65535个VMA结构体。下图显示了FCmalloc的VMA浪费情况
![](https://images.gitee.com/uploads/images/2021/1116/193553_7629c96a_8810712.png)
![](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/0405uOB3xk.jpg)
针对FCmalloc的这些问题作者提出了一种解决方案即Batch Processing。当请求内存时调用mmap一次请求多页然后交由FCmalloc来分配请求的这些页直到所有内存页都被用完才再次请求。对于free同理等待连续多页要free时才调用munmap free全部页。取得的改进效果是非常突出的同样的gcc benchmark可以节省58.7%的munmap调用和65.8的VMA开销。 针对FCmalloc的这些问题作者提出了一种解决方案即Batch Processing。当请求内存时调用mmap一次请求多页然后交由FCmalloc来分配请求的这些页直到所有内存页都被用完才再次请求。对于free同理等待连续多页要free时才调用munmap free全部页。取得的改进效果是非常突出的同样的gcc benchmark可以节省58.7%的munmap调用和65.8的VMA开销。
@ -113,7 +114,8 @@ FBmalloc的设计思想通常被称为BiBop allocator.其采用的方法与FCmal
通过上面的叙述FFmalloc的具体原理已经很清楚了。那么他与现有glibc中malloc的差别在哪里我们通过对两者内存分配流程解析来对比下FFmalloc的独特之处。 通过上面的叙述FFmalloc的具体原理已经很清楚了。那么他与现有glibc中malloc的差别在哪里我们通过对两者内存分配流程解析来对比下FFmalloc的独特之处。
malloc同样使用了pool来管理内存最重要的就是bin内存池保存在bins这个长128的数组中每个元素都是一双向个链表。 malloc同样使用了pool来管理内存最重要的就是bin内存池保存在bins这个长128的数组中每个元素都是一双向个链表。
![](https://images.gitee.com/uploads/images/2021/1117/191042_0fccb166_8810712.png)
![](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/0405pfsxy6.jpg)
- bins[0]目前没有使用 - bins[0]目前没有使用
- bins[1]的链表称为unsorted_list用于维护free释放的chunk。 - bins[1]的链表称为unsorted_list用于维护free释放的chunk。