#### 3.4.2 Routines for dynamic memory allocation

To support using any of the memory functions, you need to implement sbrk(). `malloc()`, `calloc()`, and `realloc()` all call `sbrk()` at there lowest level. `caddr_t` is defined elsewhere as `char *`. `RAMSIZE` is presently a compile time option. All this does is move a pointer to heap memory and check for the upper limit. Example libc support code. `sbrk()` returns a pointer to the previous value before more memory was allocated.

    /* _end is set in the linker command file *
    extern caddr_t _end;/

    /* just in case, most boards have at least some memory */
    #ifndef RAMSIZE
    #  define RAMSIZE             (caddr_t)0x100000
    #endif

    /*
     * sbrk -- changes heap size size. Get nbytes more
     *         RAM. We just increment a pointer in what's
     *         left of memory on the board.
     */
    caddr_t
    sbrk(nbytes)
         int nbytes;
    {
      static caddr_t heap_ptr = NULL;
      caddr_t        base;

      if (heap_ptr == NULL) {
        heap_ptr = (caddr_t)&_end;
      }

      if ((RAMSIZE - heap_ptr) >= 0) {
        base = heap_ptr;
        heap_ptr += nbytes;
        return (base);
      } else {
        errno = ENOMEM;
        return ((caddr_t)-1);
      }
    }