Index: kernel/generic/include/lib/ra.h
===================================================================
--- kernel/generic/include/lib/ra.h	(revision 0fd9b3513b2c0cfce8b0c99e0acbaf3470c1bc80)
+++ kernel/generic/include/lib/ra.h	(revision 41deb2ae92352629298dc5b5343d48f3edee449f)
@@ -77,4 +77,5 @@
 } ra_segment_t;
 
+extern void ra_init(void);
 extern ra_arena_t *ra_arena_create(void);
 extern bool ra_span_add(ra_arena_t *, uintptr_t, size_t);
Index: kernel/generic/src/lib/ra.c
===================================================================
--- kernel/generic/src/lib/ra.c	(revision 0fd9b3513b2c0cfce8b0c99e0acbaf3470c1bc80)
+++ kernel/generic/src/lib/ra.c	(revision 41deb2ae92352629298dc5b5343d48f3edee449f)
@@ -55,4 +55,6 @@
 #include <synch/spinlock.h>
 
+static slab_cache_t *ra_segment_cache;
+
 #define USED_BUCKETS	1024
 
@@ -90,5 +92,5 @@
 	ra_segment_t *seg;
 
-	seg = (ra_segment_t *) malloc(sizeof(ra_segment_t), FRAME_ATOMIC);
+	seg = slab_alloc(ra_segment_cache, FRAME_ATOMIC);
 	if (!seg)
 		return NULL;
@@ -105,5 +107,5 @@
 static void ra_segment_destroy(ra_segment_t *seg)
 {
-	free(seg);
+	slab_free(ra_segment_cache, seg);
 }
 
@@ -420,4 +422,9 @@
 }
 
+void ra_init(void)
+{
+	ra_segment_cache = slab_cache_create("segment_cache",
+	    sizeof(ra_segment_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
+}
 
 /** @}
Index: kernel/generic/src/main/main.c
===================================================================
--- kernel/generic/src/main/main.c	(revision 0fd9b3513b2c0cfce8b0c99e0acbaf3470c1bc80)
+++ kernel/generic/src/main/main.c	(revision 41deb2ae92352629298dc5b5343d48f3edee449f)
@@ -87,4 +87,5 @@
 #include <sysinfo/sysinfo.h>
 #include <sysinfo/stats.h>
+#include <lib/ra.h>
 
 /** Global configuration structure. */
@@ -212,6 +213,6 @@
 	km_identity_init();
 	frame_init();
-	/* Initialize at least 1 memory segment big enough for slab to work. */
 	slab_cache_init();
+	ra_init();	
 	sysinfo_init();
 	btree_init();
