#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define HUGE_PAGE_SIZE (2 * 1024 * 1024) // 2MB Large Page static void *hugepage_ptr = NULL; static int load_handler(module_t mod, int event, void *arg) { switch (event) { case MOD_LOAD: printf("Loading Huge Page Kernel Module...\n"); hugepage_ptr = kmem_alloc_contig(HUGE_PAGE_SIZE, M_WAITOK, 0, BUS_SPACE_MAXADDR, HUGE_PAGE_SIZE, 0, VM_MEMATTR_DEFAULT); if (!hugepage_ptr) { printf("Failed to allocate a huge page!\n"); return ENOMEM; } printf("Huge page allocated at %p\n", hugepage_ptr); break; case MOD_UNLOAD: if (hugepage_ptr) { kmem_free(hugepage_ptr, HUGE_PAGE_SIZE); printf("Huge page freed.\n"); } printf("Unloading module...\n"); break; default: return EOPNOTSUPP; } return 0; } static moduledata_t superpage_mod = { "superpage", load_handler, NULL }; DECLARE_MODULE(superpage, superpage_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);