Exemple #1
0
void* malloc(int nbytes) {

    header_t* p;
    header_t* prev;
    
    u32 nunits = (nbytes+sizeof(header_t)-1)/sizeof(header_t) + 1;
    
    if (!s_inited) _init_heap();

    //semaphore_wait(&s_malloc_sem);
    
    prev = s_start;
    
    p = prev->next;
    while(1) {
    
        if (p->size >= nunits) {
            if (p->size == nunits) {
                //an exact fit!
                prev->next = p->next;
            }
            else {
                //block is bigger than we need, split it
                p->size -= nunits;
                
                p += p->size;
                p->size = nunits;
                
            }
            //semaphore_signal(&s_malloc_sem);
            return (void*)(p+1);
        
        }
    
        
        /*wrapped around - no block found */
        if (p == s_start) {
            //semaphore_signal(&s_malloc_sem);
            return NULL;
        }
            
        prev = p;
        p = p->next;

    }
    


}
void kernel_start(uintptr_t magic, uintptr_t addr)
{
  // Initialize default serial port
  __init_serial1();

  // generate checksums of read-only areas etc.
  __init_sanity_checks();

  // Determine where free memory starts
  extern char _end;
  uintptr_t free_mem_begin = reinterpret_cast<uintptr_t>(&_end);

  if (magic == MULTIBOOT_BOOTLOADER_MAGIC) {
    free_mem_begin = _multiboot_free_begin(addr);
  }

  // Preserve symbols from the ELF binary
  free_mem_begin += _move_symbols(free_mem_begin);

  // Initialize zero-initialized vars
  _init_bss();

  // Initialize heap
  _init_heap(free_mem_begin);

  // Initialize stack-unwinder, call global constructors etc.
  _init_c_runtime();

  // Initialize system calls
  _init_syscalls();

  // Initialize early OS, platform and devices
  OS::start(magic, addr);

  // Initialize common subsystems and call Service::start
  OS::post_start();

  // verify certain read-only sections in memory
  kernel_sanity_checks();

  // Starting event loop from here allows us to profile OS::start
  OS::event_loop();
}