Index: kernel/arch/arm32/src/mm/page.c
===================================================================
--- kernel/arch/arm32/src/mm/page.c	(revision 161fbdac38609a0d06f79f81f364b0cee5130f21)
+++ kernel/arch/arm32/src/mm/page.c	(revision 77b52f0b3116076ae728f13ff6abfc9474e2b477)
@@ -57,9 +57,11 @@
 	page_table_lock(AS_KERNEL, true);
 	
-	uintptr_t cur;
-
 	/* Kernel identity mapping */
-	for (cur = PHYSMEM_START_ADDR;
-	    cur < min(config.identity_size, config.physmem_end);
+	//FIXME: We need to consider the possibility that
+	//identity_base > identity_size and physmem_end.
+	//This might lead to overflow if identity_size is too big.
+	for (uintptr_t cur = PHYSMEM_START_ADDR;
+	    cur < min(KA2PA(config.identity_base) +
+	        config.identity_size, config.physmem_end);
 	    cur += FRAME_SIZE)
 		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 161fbdac38609a0d06f79f81f364b0cee5130f21)
+++ kernel/generic/src/mm/frame.c	(revision 77b52f0b3116076ae728f13ff6abfc9474e2b477)
@@ -1282,5 +1282,8 @@
 bool frame_adjust_zone_bounds(bool low, uintptr_t *basep, size_t *sizep)
 {
-	uintptr_t limit = config.identity_size;
+	// FIXME: This might lead to overflow if the identity_size is too big
+	// but it is necessary if the PA identity_base > identity_size
+	const uintptr_t limit =
+	    KA2PA(config.identity_base) + config.identity_size;
 
 	if (low) {
