void* LinkerMemoryAllocator::realloc(void* ptr, size_t size) { if (ptr == nullptr) { return alloc(size); } if (size == 0) { free(ptr); return nullptr; } page_info* info = get_page_info(ptr); size_t old_size = 0; if (info->type == kLargeObject) { old_size = info->allocated_size - sizeof(page_info); } else { LinkerSmallObjectAllocator* allocator = get_small_object_allocator(info->type); if (allocator != info->allocator_addr) { __libc_fatal("invalid pointer %p (page signature mismatch)", ptr); } old_size = allocator->get_block_size(); } if (old_size < size) { void *result = alloc(size); memcpy(result, ptr, old_size); free(ptr); return result; } return ptr; }
void kernel_main(char boot_disk_id, void *memory_map, BootModuleInfo *boot_module_list) { init_memory_manager(memory_map); init_tty(); clear(); init_interrupts(); init_pci(); int arr[10000]; textcolor(2); printf("Structure size: %d\n",sizeof(arr)); printf("kernel_page_dir = 0x%x\n", kernel_page_dir); printf("memory_size = %d MB\n", memory_size / 1024 / 1024); printf("get_page_info(kernel_page_dir, 0xB8000) = 0x%x\n", get_page_info(kernel_page_dir, (void*)0xB8000)); }
void LinkerMemoryAllocator::free(void* ptr) { if (ptr == nullptr) { return; } page_info* info = get_page_info(ptr); if (info->type == kLargeObject) { munmap(info, info->allocated_size); } else { LinkerSmallObjectAllocator* allocator = get_small_object_allocator(info->type); if (allocator != info->allocator_addr) { __libc_fatal("invalid pointer %p (invalid allocator address for the page)", ptr); } allocator->free(ptr); } }