我试图把头部标签和脚标签内部结构malloc_chunk,像这样:
struct malloc_shunk {
INTERNAL_SIZE prev_size;
INTERNAL_SIZE size;
}
我是这样做的:
1。
struct malloc_shunk {
INTERNAL_SIZE foot_tag;
INTERNAL_SIZE prev_size;
INTERNAL_SIZE size;
}
在将head_tag放入malloc_chunk之前,我只添加了foot_tag并编译了glibc。我编写了一个小测试程序,从系统中malloc 60字节,然后释放它。虽然我可以看到malloc返回正确,自由抱怨,说"无效的指针"。返回的指针malloc是0x9313010。这使得指向malloc_chunk开始的指针为0x9313004。因此,当free传递0x9313010时,它通过(mem2chunk)将其转换为0x9313004,并检查它是否对齐。由于我的单词大小为4,因此与0x9313010的对齐检查是我遇到问题的地方。你能告诉我Mem指针(由malloc返回)是否需要绝对双字对齐。(这里它可能不满足这个条件,因为malloc返回的指针和chunk开始的指针之间的差异将是12字节,而不是8字节)。
永远来问题,我刚刚在结构中添加了1个head-tag,所以它变成了
struct malloc_shunk {INTERNAL_SIZE foot_tag;INTERNAL_SIZE prev_size;INTERNAL_SIZE大小;INTERNAL_SIZE head_tag;}现在malloc返回的指针和块开始的指针之间的差异将是16,这将始终是双字对齐。但是在这里,我面临着一个更大的问题,因为当第一个malloc被称为竞技场设置和初始化垃圾箱的时候。在这里,受害者的大小不像在正常情况下应该是零。问题是受害者->size实际上是存储'top'而不是'last_remainder'的地方。我想问问你的意见,如果有任何其他的方法/工作方法/解决方案,这样我就可以克服这个竞技场的初始化问题,我目前面临。
谢谢Kapil
从我所学到的,尽量不要修改结构malloc_chunk。即使你必须这样做,也要确保顶部指针最初为0,否则堆将永远不会形成。_int_malloc()中的sYSMALLOC()函数首先从内核映射更大的块。只有当top初始值为0时才会调用它。