reactos操作系统实现(30)

 对无效页面的一次访问称为“缺页错误”。对于这类错误都会导致中断处理函数MmAccessFault。那么什么样的情况才叫做无效页面呢?主要有下面几种情况:

l         所有访问的页面不存内存里,而是磁盘里。

l         访问的页面在后备列表里。

l         访问的页面没有提交写操作。

l         从用户态访问核心态的页面。

l         对只读页面产生写操作。

l         非法访问其它进程的页面。

可见,缺页中断处理函数不仅要处理大部份换页的情况,还需要处理非法访问其它页面的情况,因此这个函数的代码也是很复杂的。现在就来分析函数的代码,如下:

#001  NTSTATUS

#002  NTAPI

#003  MmAccessFault(IN BOOLEAN StoreInstruction,

#004                IN PVOID Address,

#005                IN KPROCESSOR_MODE Mode,

#006                IN PVOID TrapInformation)

#007  {

这个函数里的几个参数是什么意呢?

StoreInstruction是一个布尔值,表示缺页的情况是否是储存数据时,数据还没有提交的写操作出错。如果这个值为假,说明这是页面不存在或者不允许读取时产生的错误。

Address是访问出错时的页面线性地址。

Mode是指明导致这个页面出错时是内核状态,还是用户状态。

TrapInformation是指是否提供TRAP信息。

 

下面对内核内存页面处理优化。

#008      /* Cute little hack for ROS */

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

#010      {

#011  #ifdef _M_IX86

 

检查非法的页面是否在内核里面。

#012          /* Check for an invalid page directory in kernel mode */

#013          if (Mmi386MakeKernelPageTableGlobal(Address))

#014          {

 

如果在内核目录内,就返回成功。

#015              /* All is well with the world */

#016              return STATUS_SUCCESS;

#017          }

#018  #endif

#019      }

#020 

 

如果写数据时出错,就调用函数MmpAccessFault来处理写页面出错处理。

#021      /* Keep same old ReactOS Behaviour */

#022      if (StoreInstruction)

#023      {

#024          /* Call access fault */

#025          return MmpAccessFault(Mode, (ULONG_PTR)Address, TrapInformation ? FALSE : TRUE);

#026      }

#027      else

#028      {

 

如果是读取页面出错,就调用函数MmNotPresentFault来处理缺页中断处理。

#029          /* Call not present */

#030          return MmNotPresentFault(Mode, (ULONG_PTR)Address, TrapInformation ? FALSE : TRUE);

#031      }

#032  }

#033 

 

通过上面的函数分析,先作内核页面优化,然后把缺页中断分成读取页面中断和写页页中断,然后再调具体的函数去处理更详细的内容。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

caimouse

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

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

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

打赏作者

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

抵扣说明:

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

余额充值