目录
看了前面11章节的内容,我们也基本了解了ptmalloc的内存管理逻辑。此处也可以通过一些手段,获取到chunk的信息,可以来实战实验一把。
在《ptmalloc源码分析 - 内存组织单元malloc_chunk(03)》章里面我们讲解了chunk的数据结构和大小:
- #include
- #include
- #include
- #include
-
- int main() {
-
- char *s = NULL;
- s = (char *) malloc (23 * sizeof(char));
-
- char *p = NULL;
- p = (char *) malloc (25 * sizeof(char));
-
- char *p1 = NULL;
- p1 = (char *) malloc (110 * sizeof(char));
-
- printf("s : %d\r\n", s);
- printf("p : %d\r\n", p);
- printf("p1 : %d\r\n", p1);
- }
结果:
- $./main
- s : 6299664
- p : 6299696
- p1 : 6299744
-
-
- /****************/
- s的值:23 + 8 = 31 & 16 = 32
- p的值:25 + 8 = 33 & 16 = 48

我们将malloc_chunk的结构拷贝过来,以及mem2chunk/chunk2men/chunksize等几个宏定义也拷贝过来。
这样,我们可以通过mem2chunk的方式,获取得到chunk的对象指针地址。因为当前chunk在使用中,所以可以获取得到mchunk_size的值了。
由于mchunk_size字段的最后三个bit位,复用用作了(AMP)的标记位置。后三位bit位的复用,不会影响size的数据大小。所以直接取mchunk_size的时候是带上了AMP的标记数据。通过chunksize的方式,可以获得真正的chunk size数据。
- #include
- #include
- #include
- #include
-
- struct malloc_chunk {
-
-
- size_t mchunk_prev_size; /* Size of previous chunk (if free). */
-
- size_t mchunk_size; /* 当前chunk的大小 Size in bytes, including overhead. */
-
-
- struct malloc_chunk* fd; /* double links -- used only if free. */
- struct malloc_chunk* bk;
-
-
- struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
- struct malloc_chunk* bk_nextsize;
- };
- typedef struct malloc_chunk* mchunkptr;
- #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*sizeof(size_t)));
- #define chunk2mem(p) ((void*)((char*)(p) + 2*sizeof(size_t)));
- #define chunksize_nomask(p) ((p)->mchunk_size)
- #define chunksize(p) (chunksize_nomask (p) & ~(0x1|0x2|0x4))
-
- int main() {
-
- char *s = NULL;
- s = (char *) malloc (23 * sizeof(char));
-
- char *p = NULL;
- p = (char *) malloc (25 * sizeof(char));
-
- char *p1 = NULL;
- p1 = (char *) malloc (110 * sizeof(char));
-
- printf("s : %d\r\n", s);
- printf("p : %d\r\n", p);
- printf("p1 : %d\r\n", p1);
-
- printf("size:%d\r\n", sizeof(mchunkptr));
-
- mchunkptr pr = mem2chunk(p);
- printf("p chunk_size value:%d\r\n", pr->mchunk_size);
- printf("p chunk size:%d\r\n", chunksize(pr));
-
- }
结果:
- $./main
- s : 6299664
- p : 6299696
- p1 : 6299744
- size:8
- p chunk_size value:49
- p chunk size:48
我们分配一组小内存块,可以尝试将部分内存直接free。小内存块分配是是落在fastbin上的,这些内存块没有经过合并整理的操作,所以我们可以尝试从已经被free的chunk中获取得到一些信息,例如chunk->fd指针信息等。
-
- #include
- #include
- #include
- #include
-
- struct malloc_chunk {
-
-
- size_t mchunk_prev_size; /* Size of previous chunk (if free). */
-
- size_t mchunk_size; /* 当前chunk的大小 Size in bytes, including overhead. */
-
-
- struct malloc_chunk* fd; /* double links -- used only if free. */
- struct malloc_chunk* bk;
-
-
- struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
- struct malloc_chunk* bk_nextsize;
- };
- typedef struct malloc_chunk* mchunkptr;
- #define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*sizeof(size_t)));
- #define chunk2mem(p) ((void*)((char*)(p) + 2*sizeof(size_t)));
- #define chunksize_nomask(p) ((p)->mchunk_size)
- #define chunksize(p) (chunksize_nomask (p) & ~(0x1|0x2|0x4))
- #define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
- #define request2size(req) (((req) + 8 + 15 < 32) ? 32 : ((req) + 8 + 15) & ~15)
-
- int main() {
-
- malloc(20*sizeof(char));
- char *a1 =(char *) malloc(26*sizeof(char));
- char *a2 =(char *) malloc(27*sizeof(char));
- char *a3 =(char *) malloc (26 * sizeof(char));
- malloc(20*sizeof(char));
-
- /* 获取内存分配地址 */
- printf("a1 : %d\r\n", a1);
- printf("a2 : %d\r\n", a2);
- printf("a3 : %d\r\n", a3);
- /* 获取chunk 指针 */
- mchunkptr a1pr = mem2chunk(a1);
- mchunkptr a2pr = mem2chunk(a2);
- mchunkptr a3pr = mem2chunk(a3);
- printf("a1 chunk:%d\r\n", a1pr);
- printf("a2 chunk:%d\r\n", a2pr);
- printf("a3 chunk:%d\r\n", a3pr);
-
- /* 获取a2的chunk数据 */
-
- printf("p chunk_size value:%d\r\n", a2pr->mchunk_size);
- printf("p chunk size:%d\r\n", chunksize(a2pr));
-
- /* 执行free操作 */
- free(a1);
- free(a2);
- free(a3);
- printf("free a1 mchunk_size value:%d\r\n", a1pr->mchunk_size); //获取free掉的chunk的size,在fastbin上
- printf("free a2 fd value:%d\r\n", a2pr->fd);
- printf("free a3 fd value:%d\r\n", a3pr->fd);
-
- }
- $./main
- a1 : 6299696
- a2 : 6299744
- a3 : 6299792
- a1 chunk:6299680
- a2 chunk:6299728
- a3 chunk:6299776
- p chunk_size value:49
- p chunk size:48
- free a1 mchunk_size value:49
- free a2 fd value:6299680 //指向A1
- free a3 fd value:6299728 //指向A2