[ros-diffs] [ros-arm-bringup] 41529: - Initialize count of System PTEs: - Use 7000 for systems with 19MB of RAM or less, 11000 for systems between 19 and 32MB of RAM, and 22000 for systems with more than that. - Windows will go up to 50000 on server machines, but this is likely not needed now (22000 system PTEs is roughly 100 MB). - This now affects the calculation of MmNonPagedSystemStart, which is now correct and reflects the nonpaged address space of the system. - System PTEs are not yet initialized (but their page tables are mapped by the same code which maps nonpaged pool expansion VA page tables).

ros-arm-bringup at svn.reactos.org ros-arm-bringup at svn.reactos.org
Mon Jun 22 11:34:25 CEST 2009


Author: ros-arm-bringup
Date: Mon Jun 22 13:34:24 2009
New Revision: 41529

URL: http://svn.reactos.org/svn/reactos?rev=41529&view=rev
Log:
- Initialize count of System PTEs:
  - Use 7000 for systems with 19MB of RAM or less, 11000 for systems between 19 and 32MB of RAM, and 22000 for systems with more than that.
  - Windows will go up to 50000 on server machines, but this is likely not needed now (22000 system PTEs is roughly 100 MB).
  - This now affects the calculation of MmNonPagedSystemStart, which is now correct and reflects the nonpaged address space of the system.
  - System PTEs are not yet initialized (but their page tables are mapped by the same code which maps nonpaged pool expansion VA page tables).


Modified:
    trunk/reactos/ntoskrnl/mm/ARM3/init.c
    trunk/reactos/ntoskrnl/mm/ARM3/miarm.h

Modified: trunk/reactos/ntoskrnl/mm/ARM3/init.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/init.c?rev=41529&r1=41528&r2=41529&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/init.c [iso-8859-1] Mon Jun 22 13:34:24 2009
@@ -94,6 +94,13 @@
 PVOID MmNonPagedPoolStart;
 PVOID MmNonPagedPoolExpansionStart;
 PVOID MmNonPagedPoolEnd = (PVOID)0xFFBE0000;
+
+//
+// Windows NT seems to choose between 7000, 11000 and 50000
+// On systems with more than 32MB, this number is then doubled, and further
+// aligned up to a PDE boundary (4MB).
+//
+ULONG MmNumberOfSystemPtes;
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
@@ -109,11 +116,40 @@
     MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte;
     PVOID NonPagedPoolExpansionVa, BaseAddress;
     NTSTATUS Status;
+    ULONG OldCount;
     BoundaryAddressMultiple.QuadPart = Low.QuadPart = 0;
     High.QuadPart = -1;
     
     if (Phase == 0)
     {
+        //
+        // Check if this is a machine with less than 19MB of RAM
+        //
+        if (MmNumberOfPhysicalPages < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
+        {
+            //
+            // Use the very minimum of system PTEs
+            //
+            MmNumberOfSystemPtes = 7000;
+        }
+        else
+        {
+            //
+            // Use the default, but check if we have more than 32MB of RAM
+            //
+            MmNumberOfSystemPtes = 11000;
+            if (MmNumberOfPhysicalPages > MI_MIN_PAGES_FOR_SYSPTE_BOOST)
+            {
+                //
+                // Double the amount of system PTEs
+                //
+                MmNumberOfSystemPtes <<= 1;
+            }
+        }
+        
+        DPRINT1("System PTE count has been tuned to %d (%d bytes)\n",
+                MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
+        
         //
         // Check if this is a machine with less than 256MB of RAM, and no overide
         //
@@ -212,28 +248,47 @@
         NonPagedPoolExpansionVa = MmNonPagedPoolStart;
         DPRINT1("NP Pool has been tuned to: %d bytes and %d bytes\n",
                 MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes);
-        DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n",
-                MmNonPagedPoolStart, MmNonPagedPoolEnd);
-        
-        //
-        // Now calculate the nonpaged system VA region
-        // This includes nonpaged pool expansion (above) and the system PTEs
-        // Since there are no system PTEs yet, this is (for now) the same
-        //
-        MmNonPagedSystemStart = MmNonPagedPoolStart;
-        DPRINT1("NP System VA (later will be System PTEs) start at: %p\n",
-                MmNonPagedSystemStart);
-        
+        
+        //
+        // Now calculate the nonpaged system VA region, which includes the
+        // nonpaged pool expansion (above) and the system PTEs. Note that it is
+        // then aligned to a PDE boundary (4MB).
+        //
+        MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart -
+                                        (MmNumberOfSystemPtes + 1) * PAGE_SIZE);
+        MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart &
+                                        ~((4 * 1024 * 1024) - 1));
+        
+        //
+        // Don't let it go below the minimum
+        //
+        if (MmNonPagedSystemStart < (PVOID)0xEB000000)
+        {
+            //
+            // This is a hard-coded limit in the Windows NT address space
+            //
+            MmNonPagedSystemStart = (PVOID)0xEB000000;
+            
+            //
+            // Reduce the amount of system PTEs to reach this point
+            //
+            MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart -
+                                    (ULONG_PTR)MmNonPagedSystemStart) >>
+                                    PAGE_SHIFT;
+            MmNumberOfSystemPtes--;
+            ASSERT(MmNumberOfSystemPtes > 1000);
+        }
+                
         //
         // Non paged pool should come after the PFN database, but since we are
         // co-existing with the ReactOS NP pool, our "ARM Pool" will instead
         // start at this arbitrarly chosen base address.
         // When ARM pool becomes non paged pool, this needs to be changed.
         //
+        DPRINT1("System PTE VA starts at: %p\n", MmNonPagedSystemStart);
+        DPRINT1("NP Expansion VA begins at: %p and ends at: %p\n",
+                MmNonPagedPoolStart, MmNonPagedPoolEnd);
         MmNonPagedPoolStart = (PVOID)0xA0000000;
-        DPRINT1("NP VA begins at: %p and ends at: %p\n",
-                MmNonPagedPoolStart,
-                (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes);
 
         //
         // Now we actually need to get these many physical pages. Nonpaged pool
@@ -244,11 +299,14 @@
                                               High,
                                               BoundaryAddressMultiple);
         ASSERT(PageFrameIndex != 0);
+        DPRINT1("NP VA begins at: %p and ends at: %p\n",
+                MmNonPagedPoolStart,
+                (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes);        
         DPRINT1("NP PA PFN begins at: %lx\n", PageFrameIndex);
 
         //
         // Now we need some pages to create the page tables for the NP system VA
-        // which would normally include system PTEs and expansion NP
+        // which includes system PTEs and expansion NP
         //
         StartPde = MiAddressToPde(MmNonPagedSystemStart);
         EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
@@ -311,7 +369,7 @@
         }
 
         //
-        // Now rememeber where the expansion starts
+        // Now remember where the expansion starts
         //
         MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa;
 
@@ -348,7 +406,7 @@
         ASSERT(Status == STATUS_SUCCESS);
         
         //
-        // And we need one more for the system NP (expansion NP only for now)
+        // And we need one more for the system NP
         //
         BaseAddress = MmNonPagedSystemStart;
         Status = MmCreateMemoryArea(MmGetKernelAddressSpace(),
@@ -364,9 +422,27 @@
         ASSERT(Status == STATUS_SUCCESS);
         
         //
+        // Sanity check: make sure we have properly defined the system PTE space
+        //
+        ASSERT(MiAddressToPte(MmNonPagedSystemStart) <
+               MiAddressToPte(MmNonPagedPoolExpansionStart));
+        
+        //
         // Now go ahead and initialize the ARM pool
         //
         MiInitializeArmPool();
+        
+        //
+        // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs!
+        //
+        PointerPte = MiAddressToPte(MmNonPagedSystemStart);
+        OldCount = MmNumberOfSystemPtes;
+        MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) -
+                               PointerPte;
+        MmNumberOfSystemPtes--;
+        ASSERT((MmNumberOfSystemPtes - OldCount) <= 1000);
+        DPRINT1("Final System PTE count: %d (%d bytes)\n",
+                MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE);
     }
     
     //

Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?rev=41529&r1=41528&r2=41529&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Mon Jun 22 13:34:24 2009
@@ -7,6 +7,8 @@
  */
 
 #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT)
+#define MI_MIN_PAGES_FOR_SYSPTE_TUNING         ((19*1024*1024) >> PAGE_SHIFT)
+#define MI_MIN_PAGES_FOR_SYSPTE_BOOST          ((32*1024*1024) >> PAGE_SHIFT)
 #define MI_MAX_INIT_NONPAGED_POOL_SIZE         (128 * 1024 * 1024)
 #define MI_MAX_NONPAGED_POOL_SIZE              (128 * 1024 * 1024)
 #define MI_MAX_FREE_PAGE_LISTS                 4



More information about the Ros-diffs mailing list