diff --git a/process.c b/process.c
new file mode 100644
index 0000000000000000000000000000000000000000..60ff9e79feb9a88ae4047b6ee568b04938662414
--- /dev/null
+++ b/process.c
@@ -0,0 +1,40 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "hardware.h"
+#include "process.h"
+
+int current_process = NULL;
+
+int ppage_of_vpage(int process, unsigned vpage)
+{
+    if (vpage < N)
+    {
+        if (process == PROCESS_0)
+            return 2 * vpage + 2;
+        if (process == PROCESS_1)
+            return 2 * vpage + 1;
+    }
+
+    return -1;
+}
+
+void mmu_handler()
+{
+    tlb_entry_t tlb;
+    unsigned int vaddr = ((long int)_in(MMU_FAULT_ADDR_HI) << 32) | (_in(MMU_FAULT_ADDR_LO) & 0xFFFFFFFF);
+    unsigned int vpage = (vaddr >> 12) & 0xFFF;
+    unsigned int ppage = ppage_of_vpage(current_process, vpage);
+
+    if (vaddr < virtual_memory || vaddr > virtual_memory + VM_SIZE || vpage == -1)
+    {
+        fprintf(stderr, "Echec");
+        exit(EXIT_FAILURE);
+    }
+
+    tlb.s.tlb_vpage = vpage;
+    tlb.s.tlb_ppage = ppage;
+    tlb.s.tlb_rwx = 7;
+    tlb.s.tlb_used = 1;
+
+    _out(TLB_ADD_ENTRY, tlb.i);
+}
diff --git a/process.h b/process.h
new file mode 100644
index 0000000000000000000000000000000000000000..ea0b40b301048d594cdfe10fdcb48bbf5dd1afe7
--- /dev/null
+++ b/process.h
@@ -0,0 +1,34 @@
+#if !defined(PROCESS)
+#define PROCESS
+
+#define PROCESS_1 1
+#define PROCESS_0 0
+#define N 127
+#define VM_SIZE 160000 * 8
+
+#define MMU_FAULT_ADDR_LO 0xCC
+#define MMU_FAULT_ADDR_HI 0xCD
+#define TLB_ADD_ENTRY 0xCE
+
+struct tlb_entry_s
+{
+    unsigned tlb_RFU : 8;
+    unsigned tlb_vpage : 12;
+    unsigned tlb_ppage : 8;
+    unsigned tlb_rwx : 3;
+    unsigned tlb_used : 1;
+};
+
+union tlb_entry_u
+{
+    int i;
+    struct tlb_entry_s s;
+};
+
+typedef union tlb_entry_u tlb_entry_t;
+
+int ppage_of_vpage(int process, unsigned vpage);
+
+void mmu_handler();
+
+#endif // PROCESS