[U-Boot] [PATCH v8] [RFC] early_malloc for DM added.

Graeme Russ graeme.russ at gmail.com
Wed Sep 26 01:04:52 CEST 2012


Hi Tomas

On Tue, Sep 25, 2012 at 7:09 PM, Graeme Russ <graeme.russ at gmail.com> wrote:

> We should implement each of malloc(), free(), calloc(), and realloc().
>
> Don't worry about reclaiming and reusing space with a proper free()
> implementation. Remember, all memory allocated on the early heap must be
> relocated anyway.
>
> Maybe if you add a size_t value immediately before the allocated space which
> stores the block size. So:
>
> size_t *bytes_ptr = ptr;
> bytes_ptr--;
> size_t bytes = *bytes_ptr;
>
> gives you the block size

I've been thinking about this a bit more, and for the sake of 4 bytes,
this additional 'size' member could be quite handy:
 - We effectively end up with a linked-list of allocated blocks
 - free() could set the high bit to tag the block as 'de-allocated'
 - When a block is relocated into the permanent heap, free() should be
   called on the source (early heap) block
 - We can call a 'cleanup' function after early heap is no longer needed
   and check that every block has the high bit set
 - We can re-use blocks by scanning for a tagged block with the same size
   (usefull for drivers that allocate temporary buffers which are always
   the same size)
 - If there are no early heaps with enough space for a given malloc
   operation, but there is a tagged block that is larger than the
   requested size, we can split tagged blocks

Remebering back to when I suggested a list of relocation helpers (one for
each allocated block), I think we can implement that as an additional field
in the block header (stretching the header to 8 bytes). This can come later.

Regards,

Graeme


More information about the U-Boot mailing list