int f () { vmspace_t vms; // CHECK: init: 0 kprintf("init: %d\n", vmspace_init(&vms, 0xC1000000, 0x1C000000)); // CHECK: alloc1: dcfea000 kprintf("alloc1: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc2: dcfe8000 kprintf("alloc2: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc3: dcfe9000 kprintf("alloc3: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc4: dcfe0000 kprintf("alloc4: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc5: dcfe1000 kprintf("alloc5: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc6: dcfe2000 kprintf("alloc6: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc7: dcfc0000 kprintf("alloc7: %x\n", vmspace_alloc(&vms, 0x10000, 0)); vmspace_free(&vms, 0x1000, 0xdcfe2000, 0); // CHECK: alloc8: dcfe2000 kprintf("alloc8: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // If we free everything we just allocated, and then allocate // them again, we can check buddies were correctly merged // by observing that the allocations return the same values // in the same order. vmspace_free(&vms, 0x1000, 0xdcfea000, 0); vmspace_free(&vms, 0x1000, 0xdcfe8000, 0); vmspace_free(&vms, 0x1000, 0xdcfe9000, 0); vmspace_free(&vms, 0x1000, 0xdcfe0000, 0); vmspace_free(&vms, 0x1000, 0xdcfe1000, 0); vmspace_free(&vms, 0x1000, 0xdcfe2000, 0); vmspace_free(&vms, 0x10000, 0xdcfc0000, 0); // CHECK: alloc1: dcfea000 kprintf("alloc1: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc2: dcfe8000 kprintf("alloc2: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc3: dcfe9000 kprintf("alloc3: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc4: dcfe0000 kprintf("alloc4: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc5: dcfe1000 kprintf("alloc5: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc6: dcfe2000 kprintf("alloc6: %x\n", vmspace_alloc(&vms, 0x1000, 0)); // CHECK: alloc7: dcfc0000 kprintf("alloc7: %x\n", vmspace_alloc(&vms, 0x10000, 0)); // CHECK-NOT: Page fault uintptr_t *addr = (uintptr_t*)vmspace_alloc(&vms, 0x1000, 1); *addr = 0x42; return 0; }
static int kmalloc_init() { /* FIXME: Make vmspace_init deal with addresses that aren't initially maximally aligned so we can give it 0xC0400000 as the starting address (first address after first 4MB identity map (x86)) */ if (vmspace_init(&kernel_vmspace, MMAP_KERNEL_VMSPACE_START, MMAP_KERNEL_VMSPACE_END-MMAP_KERNEL_VMSPACE_START) == -1) { assert(0 && "kernel_vmspace init failed!"); return -1; } int r = 0; for (unsigned i = 0; i <= MAX_CACHESZ_LOG2-MIN_CACHESZ_LOG2; ++i) { r |= slab_cache_create(&caches[i], &kernel_vmspace, 1U<<(i+MIN_CACHESZ_LOG2), NULL); } assert(r == 0 && "slab cache creation failed!"); return 1; }