Parcourir la source

Kernel: Use the CPU's NX bit to enforce PROT_EXEC on memory mappings

Now that we have PAE support, we can ask the CPU to crash processes for
trying to execute non-executable memory. This is pretty cool! :^)
Andreas Kling il y a 5 ans
Parent
commit
ce5f7f6c07
2 fichiers modifiés avec 9 ajouts et 0 suppressions
  1. 7 0
      Kernel/VM/MemoryManager.cpp
  2. 2 0
      Kernel/VM/Region.cpp

+ 7 - 0
Kernel/VM/MemoryManager.cpp

@@ -167,6 +167,13 @@ void MemoryManager::initialize_paging()
         "orl $0x20, %eax\n"
         "mov %eax, %cr4\n");
 
+    // Turn on IA32_EFER.NXE
+    asm volatile(
+        "movl $0xc0000080, %ecx\n"
+        "rdmsr\n"
+        "orl $0x800, %eax\n"
+        "wrmsr\n");
+
     asm volatile("movl %%eax, %%cr3" ::"a"(kernel_page_directory().cr3()));
     asm volatile(
         "movl %%cr0, %%eax\n"

+ 2 - 0
Kernel/VM/Region.cpp

@@ -216,6 +216,7 @@ void Region::remap_page(size_t index)
         pte.set_writable(false);
     else
         pte.set_writable(is_writable());
+    pte.set_execute_disabled(!is_executable());
     pte.set_user_allowed(is_user_accessible());
     m_page_directory->flush(page_vaddr);
 #ifdef MM_DEBUG
@@ -264,6 +265,7 @@ void Region::map(PageDirectory& page_directory)
                 pte.set_writable(false);
             else
                 pte.set_writable(is_writable());
+            pte.set_execute_disabled(!is_executable());
         } else {
             pte.set_physical_page_base(0);
             pte.set_present(false);