gpt4 book ai didi

自定义 malloc() 实现头设计

转载 作者:太空狗 更新时间:2023-10-29 17:20:19 24 4
gpt4 key购买 nike

我正在尝试在 C 中编写一个用于调试目的的自定义分配器(作为练习),我将在其中使用单个链接列表使用首次适合算法将空闲内存列表放在一起。我在下面展示了我想在“空内存节点”中创建的结构。

我如何在内存的前几个字节写入 header block (具体来说是 union ),我获得(我正在使用 malloc() 初始获取一 block 内存)以便剩余字节空闲?

这是我正在使用的 union :

/*Define Header Structure for proper alignment*/
union header {
struct{
union header* next;
unsigned size ; /*Make it size_t*/
}s;
double dummy_align_var;
};

-------------------------------------------------------------------------------
|Next |Size of |16Byte| User is concerned only about |16Byte| |
|Free Memory |Allocated|Header| this portion of memory |Footer|Checksum |
|Address |Block |Picket| and has no knowledge of rest |Picket| |
-------------------------------------------------------------------------------
|-------Header---------| ^Address Returned to user
^------User Requested Size-----^
^-------------Memory Obtained From The Operating System-----------------------^
*/

[编辑]根据提供的建议更改 block 结构。

最佳答案

对于调试 malloc,请考虑在您的控制结构和用户数据的开头以及用户数据的结尾和校验和之间放置填充空间。填充的一个字节应该是零字节 0x00 - 因此字符串操作停止;考虑把另一个作为 0xFF。如果您有一个固定的模式并发现它发生了变化,您就知道有什么东西越界了——但是您的敏感控制数据更有可能没有被践踏。如果您在分配给用户的空间的任一侧使用 16 字节的填充,您可能会将 4 个字节的零适当对齐(因此是一个零 4 字节整数)并且可能是 0xFFFFFFFF 用于 -1。此外,由于您可能会将请求的大小四舍五入为基本 block 大小的倍数,因此将不供用户使用的字节设置为已知值 - 并验证它们是否保持不变。这将检测到“超过分配长度的一个”的修改,或者只是超过分配长度的几个字节的修改,否则可能无法检测到。

填充中零字节的唯一缺点是,当查找空字节时,您不会轻易检测到未在分配的内存末尾停止的读取操作。您可以通过使用其中没有零字节的填充的替代选项来深入了解这些内容。

要考虑的另一个选择是尝试将您的控制数据与返回给用户的内存完全分开。当然,完全分离是不可能的,但至少维护一个与分配的 block 分开的分配列表(包括大小和指针)。同样,这通过使您宝贵的控制数据远离不受控制的内存践踏操作来为您提供保护。您并没有完全免受错误指针的影响,但是您得到了更好的保护。 (并且您仍然可以在分配的空间周围提供缓冲区以检测失控的写入。)但是,这种设计与问题明显不同。


假设您从“malloc()”获取内存块,那么您会做 - 大致:

void *my_malloc(size_t nbytes)
{
size_t reqblocks = (nbytes + sizeof(header) - 1) / sizeof(header);
size_t reqspace = (reqblocks + 2) * sizeof(header) + 2 * sizeof(padding);
void *space = malloc(reqspace);
if (space == 0)
return space;
void *retval = (char *)space + sizeof(header) + sizeof(padding);
header *head = space;
head->next = ...next...;
head->size = nbytes;
...set head padding to chosen value...
...set tail padding to chosen value...
...set gap between nbytes and block boundary to chosen value...
return retval;
}

还有一些解释要做...

关于自定义 malloc() 实现头设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1700905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com