reactos操作系统实现(32)

这个函数主要功能就是实现访问不存在的页面。

#001  NTSTATUS

#002  NTAPI

#003  MmNotPresentFault(KPROCESSOR_MODE Mode,

#004                             ULONG_PTR Address,

#005                             BOOLEAN FromMdl)

#006  {

#007     PMM_AVL_TABLE AddressSpace;

#008     MEMORY_AREA* MemoryArea;

#009     NTSTATUS Status;

#010     BOOLEAN Locked = FromMdl;

#011     PFN_TYPE Pfn;

#012 

#013     DPRINT("MmNotPresentFault(Mode %d, Address %x)/n", Mode, Address);

#014 

 

判断访问内存的级别。

#015     if (KeGetCurrentIrql() >= DISPATCH_LEVEL)

#016     {

#017        DPRINT1("Page fault at high IRQL was %d, address %x/n", KeGetCurrentIrql(), Address);

#018        return(STATUS_UNSUCCESSFUL);

#019     }

#020 

 

判断是否在内核内存,还是在进程内存空间上。

#021     /*

#022      * Find the memory area for the faulting address

#023      */

#024     if (Address >= (ULONG_PTR)MmSystemRangeStart)

#025     {

#026        /*

#027         * Check permissions

#028         */

#029        if (Mode != KernelMode)

#030        {

#031        DPRINT1("Address: %x/n", Address);

#032           return(STATUS_ACCESS_VIOLATION);

#033        }

#034        AddressSpace = MmGetKernelAddressSpace();

#035     }

#036     else

#037     {

#038        AddressSpace = &PsGetCurrentProcess()->VadRoot;

#039     }

#040 

#041     if (!FromMdl)

#042     {

#043        MmLockAddressSpace(AddressSpace);

#044     }

#045 

 

根据内存类型调用不同的缺页中断处理函数。

#046     /*

#047      * Call the memory area specific fault handler

#048      */

#049     do

#050     {

#051        MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, (PVOID)Address);

#052        if (MemoryArea == NULL || MemoryArea->DeleteInProgress)

#053        {

#054           if (!FromMdl)

#055           {

#056              MmUnlockAddressSpace(AddressSpace);

#057           }

#058           return (STATUS_ACCESS_VIOLATION);

#059        }

#060 

#061        switch (MemoryArea->Type)

#062        {

#063           case MEMORY_AREA_PAGED_POOL:

#064              {

#065                 Status = MmCommitPagedPoolAddress((PVOID)Address, Locked);

#066                 break;

#067              }

#068 

#069           case MEMORY_AREA_SYSTEM:

#070              Status = STATUS_ACCESS_VIOLATION;

#071              break;

#072 

#073           case MEMORY_AREA_SECTION_VIEW:

#074              Status = MmNotPresentFaultSectionView(AddressSpace,

#075                                                    MemoryArea,

#076                                                    (PVOID)Address,

#077                                                    Locked);

#078              break;

#079 

#080           case MEMORY_AREA_VIRTUAL_MEMORY:

#081           case MEMORY_AREA_PEB_OR_TEB:

#082              Status = MmNotPresentFaultVirtualMemory(AddressSpace,

#083                                                      MemoryArea,

#084                                                      (PVOID)Address,

#085                                                      Locked);

#086              break;

#087 

#088           case MEMORY_AREA_SHARED_DATA:

#089              Pfn = MmSharedDataPagePhysicalAddress.LowPart >> PAGE_SHIFT;

#090              Status =

#091                 MmCreateVirtualMapping(PsGetCurrentProcess(),

#092                                        (PVOID)PAGE_ROUND_DOWN(Address),

#093                                        PAGE_READONLY,

#094                                        &Pfn,

#095                                        1);

#096              break;

#097 

#098           default:

#099              Status = STATUS_ACCESS_VIOLATION;

#100              break;

#101        }

#102     }

#103     while (Status == STATUS_MM_RESTART_OPERATION);

#104 

#105     DPRINT("Completed page fault handling/n");

#106     if (!FromMdl)

#107     {

#108        MmUnlockAddressSpace(AddressSpace);

#109     }

#110     return(Status);

#111  }

通过上面的函数,就可以实现读取内存不存在的缺页中断处理。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值