mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
- Initialize the page directory for a new process from global kernel page directory in MmCopyMmInfo.
- Check for kernel or user space in MmIsAccessedAndResetAcessPage/MmSetCleanPage/MmSetDirtyPage. - Added InitGlobalKernelPageDirectory. svn path=/trunk/; revision=4700
This commit is contained in:
parent
fd4d79b7fd
commit
f5048a6a3b
3 changed files with 81 additions and 29 deletions
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue