- Initialize the page directory for a new process from global kernel page directory...
authorHartmut Birr <osexpert@googlemail.com>
Sat, 17 May 2003 13:45:04 +0000 (13:45 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Sat, 17 May 2003 13:45:04 +0000 (13:45 +0000)
- Check for kernel or user space in MmIsAccessedAndResetAcessPage/MmSetCleanPage/MmSetDirtyPage.
- Added InitGlobalKernelPageDirectory.

svn path=/trunk/; revision=4700

reactos/ntoskrnl/include/internal/mm.h
reactos/ntoskrnl/mm/i386/page.c
reactos/ntoskrnl/mm/mminit.c

index 1b7a0e6..dc5ca20 100644 (file)
@@ -293,7 +293,6 @@ PVOID MmFindGap(PMADDRESS_SPACE AddressSpace, ULONG Length);
 VOID ExUnmapPage(PVOID Addr);
 PVOID ExAllocatePage(VOID);
 
-VOID MmInitPagingFile(VOID);
 BOOLEAN MmReserveSwapPages(ULONG Nr);
 VOID MmDereserveSwapPages(ULONG Nr);
 SWAPENTRY MmAllocSwapPage(VOID);
@@ -467,6 +466,8 @@ VOID MmSetPageProtect(struct _EPROCESS* Process,
 BOOLEAN MmIsPagePresent(struct _EPROCESS* Process, 
                        PVOID Address);
 
+VOID MmInitGlobalKernelPageDirectory(VOID);
+
 /* Memory balancing. */
 VOID
 MmInitializeMemoryConsumer(ULONG Consumer, 
index 6064cd6..40ae991 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: page.c,v 1.49 2003/05/08 05:26:36 gvg Exp $
+/* $Id: page.c,v 1.50 2003/05/17 13:45:04 hbirr Exp $
  *
  * PROJECT:     ReactOS kernel
  * FILE:        ntoskrnl/mm/i386/page.c
@@ -135,9 +135,7 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest)
 {
    PHYSICAL_ADDRESS PhysPageDirectory;
    PULONG PageDirectory;
-   PULONG CurrentPageDirectory;
    PKPROCESS KProcess = &Dest->Pcb;
-   ULONG i;
    
    DPRINT("MmCopyMmInfo(Src %x, Dest %x)\n", Src, Dest);
    
@@ -148,17 +146,12 @@ NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest)
      }
    PhysPageDirectory = MmGetPhysicalAddress(PageDirectory);
    KProcess->DirectoryTableBase = PhysPageDirectory;   
-   CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP;
    
-   memset(PageDirectory,0,PAGE_SIZE);
-   for (i=768; i<896; i++)
-     {
-       PageDirectory[i] = CurrentPageDirectory[i];
-     }
-   for (i=961; i<1024; i++)
-     {
-       PageDirectory[i] = CurrentPageDirectory[i];
-     }
+   memset(PageDirectory,0, ADDR_TO_PDE_OFFSET(KERNEL_BASE) * sizeof(ULONG));
+   memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), 
+          MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), 
+         (1024 - ADDR_TO_PDE_OFFSET(KERNEL_BASE)) * sizeof(ULONG));
+
    DPRINT("Addr %x\n",PAGETABLE_MAP / (4*1024*1024));
    PageDirectory[PAGETABLE_MAP / (4*1024*1024)] = 
      PhysPageDirectory.u.LowPart | PA_PRESENT | PA_READWRITE;
@@ -805,13 +798,27 @@ BOOLEAN
 MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address)
 {
    PULONG PageEntry;
-   PEPROCESS CurrentProcess = PsGetCurrentProcess();
+   PEPROCESS CurrentProcess;
    BOOLEAN Accessed;
 
-   if (Process != CurrentProcess)
+   if (Process)
      {
-       KeAttachProcess(Process);
+       CurrentProcess = PsGetCurrentProcess();
+       if (Process != CurrentProcess)
+         {
+          KeAttachProcess(Process);
+         }
      }
+   else 
+     {
+       if (((ULONG)Address & ~0xFFF) < KERNEL_BASE)
+         {
+           DPRINT1("MmIsAccessedAndResetAccessPage is called for user space without a process.\n");
+           KeBugCheck(0);
+        }
+       CurrentProcess = NULL;
+     }
+
    PageEntry = MmGetPageEntry(Address);
    Accessed = (*PageEntry) & PA_ACCESSED;
    if (Accessed)
@@ -830,11 +837,24 @@ MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address)
 VOID MmSetCleanPage(PEPROCESS Process, PVOID Address)
 {
    PULONG PageEntry;
-   PEPROCESS CurrentProcess = PsGetCurrentProcess();
-   
-   if (Process != CurrentProcess)
+   PEPROCESS CurrentProcess;
+
+   if (Process)
      {
-       KeAttachProcess(Process);
+       CurrentProcess = PsGetCurrentProcess();
+       if (Process != CurrentProcess)
+         {
+          KeAttachProcess(Process);
+         }
+     }
+   else 
+     {
+       if (((ULONG)Address & ~0xFFF) < KERNEL_BASE)
+         {
+           DPRINT1("MmSetCleanPage is called for user space without a process.\n");
+           KeBugCheck(0);
+        }
+       CurrentProcess = NULL;
      }
    PageEntry = MmGetPageEntry(Address);
    (*PageEntry) = (*PageEntry) & (~PA_DIRTY);
@@ -848,11 +868,24 @@ VOID MmSetCleanPage(PEPROCESS Process, PVOID Address)
 VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address)
 {
    PULONG PageEntry;
-   PEPROCESS CurrentProcess = PsGetCurrentProcess();
-   
-   if (Process != CurrentProcess)
+   PEPROCESS CurrentProcess = NULL;
+
+   if (Process)
      {
-       KeAttachProcess(Process);
+       CurrentProcess = PsGetCurrentProcess();
+       if (Process != CurrentProcess)
+         {
+          KeAttachProcess(Process);
+         }
+     }
+   else 
+     {
+       if (((ULONG)Address & ~0xFFF) < KERNEL_BASE)
+         {
+           DPRINT1("MmSetDirtyPage is called for user space without a process.\n");
+           KeBugCheck(0);
+        }
+       CurrentProcess = NULL;
      }
    PageEntry = MmGetPageEntry(Address);
    (*PageEntry) = (*PageEntry) | PA_DIRTY;
@@ -950,7 +983,7 @@ MmCreateVirtualMappingForKernel(PVOID Address,
    *Pte = PhysicalAddress.QuadPart | Attributes;
    if (Process != NULL && 
        Process->AddressSpace.PageTableRefCountTable != NULL &&
-       ADDR_TO_PAGE_TABLE(Address) < 768 &&
+       Address < (PVOID)KERNEL_BASE &&
        Attributes & PA_PRESENT)
      {
        PUSHORT Ptrc;
@@ -1021,7 +1054,7 @@ MmCreatePageFileMapping(PEPROCESS Process,
   *Pte = SwapEntry << 1;
   if (Process != NULL && 
       Process->AddressSpace.PageTableRefCountTable != NULL &&
-      ADDR_TO_PAGE_TABLE(Address) < 768)
+      Address < (PVOID)KERNEL_BASE)
     {
       PUSHORT Ptrc;
       
@@ -1104,7 +1137,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
    *Pte = PhysicalAddress.QuadPart | Attributes;
    if (Process != NULL && 
        Process->AddressSpace.PageTableRefCountTable != NULL &&
-       ADDR_TO_PAGE_TABLE(Address) < 768 &&
+       Address < (PVOID)KERNEL_BASE &&
        Attributes & PA_PRESENT)
      {
        PUSHORT Ptrc;
@@ -1224,4 +1257,20 @@ MmUpdatePageDir(PULONG LocalPageDir, PVOID Address)
     }
 }
 
+VOID 
+MmInitGlobalKernelPageDirectory(VOID)
+{
+  ULONG i;
+  PULONG CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP;
+
+  for (i = ADDR_TO_PDE_OFFSET(KERNEL_BASE); i < 1024; i++)
+    {
+      if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && 
+         0 == MmGlobalKernelPageDirectory[i] && 0 != CurrentPageDirectory[i])
+        {
+          MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i];
+        }
+    }
+}
+
 /* EOF */
index 3e6fd46..82cf919 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mminit.c,v 1.43 2003/01/11 15:26:59 hbirr Exp $
+/* $Id: mminit.c,v 1.44 2003/05/17 13:45:04 hbirr Exp $
  *
  * COPYRIGHT:   See COPYING in the top directory
  * PROJECT:     ReactOS kernel 
@@ -219,6 +219,8 @@ VOID MmInit1(ULONG FirstKrnlPhysAddr,
                  LastKrnlPhysAddr,
                  LastKernelAddress);
 
+   MmInitGlobalKernelPageDirectory();
+
    if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0))
      {
        // If we have a bios memory map, recalulate the the memory size