示例#1
0
文件: vmspace.c 项目: berkus/JMTK
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;
}
示例#2
0
文件: kmalloc.c 项目: roscopeco/mink
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;
}