Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision 8b6aa3923668ec2fbb91e100c43265f2f32fe31c)
+++ kernel/arch/amd64/Makefile.inc	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -32,5 +32,5 @@
 
 FPU_NO_CFLAGS = -mno-sse -mno-sse2
-CMN1 = -m64 -mcmodel=kernel -mno-red-zone -fno-unwind-tables -fno-omit-frame-pointer
+CMN1 = -m64 -mcmodel=$(MEMORY_MODEL) -mno-red-zone -fno-unwind-tables -fno-omit-frame-pointer
 GCC_CFLAGS += $(CMN1)
 ICC_CFLAGS += $(CMN1)
Index: kernel/arch/amd64/include/arch/mm/km.h
===================================================================
--- kernel/arch/amd64/include/arch/mm/km.h	(revision 8b6aa3923668ec2fbb91e100c43265f2f32fe31c)
+++ kernel/arch/amd64/include/arch/mm/km.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -38,9 +38,23 @@
 #include <typedefs.h>
 
-#define KM_AMD64_IDENTITY_START		UINT64_C(0xffffffff80000000)
-#define KM_AMD64_IDENTITY_SIZE		UINT64_C(0x0000000080000000)
+#ifdef MEMORY_MODEL_kernel
 
-#define KM_AMD64_NON_IDENTITY_START	UINT64_C(0xffff800000000000)
-#define KM_AMD64_NON_IDENTITY_SIZE	UINT64_C(0x00007fff80000000)
+#define KM_AMD64_IDENTITY_START      UINT64_C(0xffffffff80000000)
+#define KM_AMD64_IDENTITY_SIZE       UINT64_C(0x0000000080000000)
+
+#define KM_AMD64_NON_IDENTITY_START  UINT64_C(0xffff800000000000)
+#define KM_AMD64_NON_IDENTITY_SIZE   UINT64_C(0x00007fff80000000)
+
+#endif /* MEMORY_MODEL_kernel */
+
+#ifdef MEMORY_MODEL_large
+
+#define KM_AMD64_IDENTITY_START      UINT64_C(0xffff800000000000)
+#define KM_AMD64_IDENTITY_SIZE       UINT64_C(0x0000400000000000)
+
+#define KM_AMD64_NON_IDENTITY_START  UINT64_C(0xffffc00000000000)
+#define KM_AMD64_NON_IDENTITY_SIZE   UINT64_C(0x0000400000000000)
+
+#endif /* MEMORY_MODEL_large */
 
 extern void km_identity_arch_init(void);
Index: kernel/arch/amd64/include/arch/mm/page.h
===================================================================
--- kernel/arch/amd64/include/arch/mm/page.h	(revision 8b6aa3923668ec2fbb91e100c43265f2f32fe31c)
+++ kernel/arch/amd64/include/arch/mm/page.h	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -42,4 +42,6 @@
 #define PAGE_SIZE   FRAME_SIZE
 
+#ifdef MEMORY_MODEL_kernel
+
 #ifndef __ASM__
 
@@ -53,4 +55,22 @@
 
 #endif /* __ASM__ */
+
+#endif /* MEMORY_MODEL_kernel */
+
+#ifdef MEMORY_MODEL_large
+
+#ifndef __ASM__
+
+#define KA2PA(x)  (((uintptr_t) (x)) - UINT64_C(0xffff800000000000))
+#define PA2KA(x)  (((uintptr_t) (x)) + UINT64_C(0xffff800000000000))
+
+#else /* __ASM__ */
+
+#define KA2PA(x)  ((x) - 0xffff800000000000)
+#define PA2KA(x)  ((x) + 0xffff800000000000)
+
+#endif /* __ASM__ */
+
+#endif /* MEMORY_MODEL_large */
 
 /* Number of entries in each level. */
Index: kernel/arch/amd64/src/boot/multiboot.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot.S	(revision 8b6aa3923668ec2fbb91e100c43265f2f32fe31c)
+++ kernel/arch/amd64/src/boot/multiboot.S	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -430,10 +430,21 @@
 	movl multiboot_eax, %edi
 	movl multiboot_ebx, %esi
+	
+#ifdef MEMORY_MODEL_large
+	movabsq $amd64_pre_main, %rax
+	callq *%rax
+#else
 	callq amd64_pre_main
-
+#endif
+	
 	long_status $status_main
 	
 	/* Call main_bsp() */
-	callq main_bsp 
+#ifdef MEMORY_MODEL_large
+	movabsq $main_bsp, %rax
+	callq *%rax
+#else
+	callq main_bsp
+#endif
 	
 	/* Not reached */
@@ -622,4 +633,5 @@
 	ptl2gen 512 7
 
+#ifdef MEMORY_MODEL_kernel
 .align 4096
 ptl_1:
@@ -638,5 +650,4 @@
 	.quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT)
 
-
 .align 4096
 SYMBOL(ptl_0)
@@ -644,4 +655,27 @@
 	.fill 510, 8, 0
 	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
+#endif
+
+#ifdef MEMORY_MODEL_large
+.align 4096
+ptl_1:
+	/* Identity mapping for [0; 8G) */
+	.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_4g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_5g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_6g + (PTL_WRITABLE | PTL_PRESENT)
+	.quad ptl_2_7g + (PTL_WRITABLE | PTL_PRESENT)
+	.fill 504, 8, 0
+
+.align 4096
+SYMBOL(ptl_0)
+	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
+	.fill 255, 8, 0
+	.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT)
+	.fill 255, 8, 0
+#endif
 
 .section K_DATA_START, "aw", @progbits
Index: kernel/arch/amd64/src/boot/multiboot2.S
===================================================================
--- kernel/arch/amd64/src/boot/multiboot2.S	(revision 8b6aa3923668ec2fbb91e100c43265f2f32fe31c)
+++ kernel/arch/amd64/src/boot/multiboot2.S	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -253,8 +253,19 @@
 	movl multiboot_eax, %edi
 	movl multiboot_ebx, %esi
-	callq amd64_pre_main 
+	
+#ifdef MEMORY_MODEL_large
+	movabsq $amd64_pre_main, %rax
+	callq *%rax
+#else
+	callq amd64_pre_main
+#endif
 	
 	/* Call main_bsp() */
-	callq main_bsp 
+#ifdef MEMORY_MODEL_large
+	movabsq $main_bsp, %rax
+	callq *%rax
+#else
+	callq main_bsp
+#endif
 	
 	/* Not reached */
Index: kernel/arch/amd64/src/context.S
===================================================================
--- kernel/arch/amd64/src/context.S	(revision 8b6aa3923668ec2fbb91e100c43265f2f32fe31c)
+++ kernel/arch/amd64/src/context.S	(revision 4bf0926eafdfba5eb055645d92feb2f44e40542f)
@@ -50,6 +50,11 @@
 	movq %r14, CONTEXT_OFFSET_R14(%rdi)
 	movq %r15, CONTEXT_OFFSET_R15(%rdi)
-
+	
+#ifdef MEMORY_MODEL_large
+	movabsq $vreg_ptr, %rsi
+	movq (%rsi), %rsi
+#else
 	movq vreg_ptr, %rsi
+#endif
 	movq %fs:VREG_TP(%rsi), %rsi
 	movq %rsi, CONTEXT_OFFSET_TP(%rdi)
@@ -79,6 +84,11 @@
 	movq %rdx, (%rsp)
 	
-	movq CONTEXT_OFFSET_TP(%rdi), %rcx 
+	movq CONTEXT_OFFSET_TP(%rdi), %rcx
+#ifdef MEMORY_MODEL_large
+	movabsq $vreg_ptr, %rsi
+	movq (%rsi), %rsi
+#else
 	movq vreg_ptr, %rsi
+#endif
 	movq %rcx, %fs:VREG_TP(%rsi)
 	
