zoukankan      html  css  js  c++  java
  • 自己实现一个内存管理器

    看了这篇文章

    https://arjunsreedharan.org/post/148675821737/memory-allocators-101-write-a-simple-memory  

    主要内容就是介绍了实现简化版malloc free的过程。之前玩过pwn,代码理解起来还是挺简单的

    #include <zconf.h>
    #include <pthread.h>
    #include <string.h>
    
    typedef char ALIGN[16];
    
    union header {
        struct {
            size_t size;
            unsigned is_free;
            union header *next;
        } s;
        ALIGN stub;
    };
    typedef union header header_t;
    
    header_t *head, *tail;
    pthread_mutex_t global_malloc_lock;
    
    header_t *get_free_block(size_t size)
    {
        header_t *curr = head;
        while(curr) {
            if (curr->s.is_free && curr->s.size >= size)
                return curr;
            curr = curr->s.next;
        }
        return NULL;
    }
    
    void *malloc(size_t size)
    {
        size_t total_size;
        void *block;
        header_t *header;
        if (!size)
            return NULL;
        pthread_mutex_lock(&global_malloc_lock);
        header = get_free_block(size);
        if (header) {
            header->s.is_free = 0;
            pthread_mutex_unlock(&global_malloc_lock);
            return (void*)(header + 1);
        }
        total_size = sizeof(header_t) + size;
        block = sbrk(total_size);
        if (block == (void*) -1) {
            pthread_mutex_unlock(&global_malloc_lock);
            return NULL;
        }
        header = block;
        header->s.size = size;
        header->s.is_free = 0;
        header->s.next = NULL;
        if (!head)
            head = header;
        if (tail)
            tail->s.next = header;
        tail = header;
        pthread_mutex_unlock(&global_malloc_lock);
        return (void*)(header + 1);
    }
    
    void free(void *block)
    {
        header_t *header, *tmp;
        void *programbreak;
    
        if (!block)
            return;
        pthread_mutex_lock(&global_malloc_lock);
        header = (header_t*)block - 1;
    
        programbreak = sbrk(0);
        if ((char*)block + header->s.size == programbreak) {
            if (head == tail) {
                head = tail = NULL;
            } else {
                tmp = head;
                while (tmp) {
                    if(tmp->s.next == tail) {
                        tmp->s.next = NULL;
                        tail = tmp;
                    }
                    tmp = tmp->s.next;
                }
            }
            sbrk(0 - sizeof(header_t) - header->s.size);
            pthread_mutex_unlock(&global_malloc_lock);
            return;
        }
        header->s.is_free = 1;
        pthread_mutex_unlock(&global_malloc_lock);
    }
    
    void *calloc(size_t num, size_t nsize)
    {
        size_t size;
        void *block;
        if (!num || !nsize)
            return NULL;
        size = num * nsize;
        /* check mul overflow */
        if (nsize != size / num)
            return NULL;
        block = malloc(size);
        if (!block)
            return NULL;
        memset(block, 0, size);
        return block;
    }
    
    void *realloc(void *block, size_t size)
    {
        header_t *header;
        void *ret;
        if (!block || !size)
            return malloc(size);
        header = (header_t*)block - 1;
        if (header->s.size >= size)
            return block;
        ret = malloc(size);
        if (ret) {
    
            memcpy(ret, block, header->s.size);
            free(block);
        }
        return ret;
    }
    

      

  • 相关阅读:
    题解:艾米利亚的魔法
    tarjan求割点
    集合删数
    小测题解
    [考试]20141028
    铺地毯
    [考试]20141027
    大家好
    【DM642学习笔记一】关于Can't Initialize Target CPU的一种解决方法 : Error 0x80000240
    iOS开发之获取系统相册ALAssetLibrary
  • 原文地址:https://www.cnblogs.com/junmoxiao/p/12891318.html
Copyright © 2011-2022 走看看