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(); }