加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(30)

发布时间:2020-12-15 05:02:11 所属栏目:百科 来源:网络整理
导读:对无效页面的一次访问称为“缺页错误”。对于这类错误都会导致中断处理函数 MmAccessFault 。那么什么样的情况才叫做无效页面呢?主要有下面几种情况: l 所有访问的页面不存内存里,而是磁盘里。 l 访问的页面在后备列表里。 l 访问的页面没有提交写操作。

对无效页面的一次访问称为“缺页错误”。对于这类错误都会导致中断处理函数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,TrapInformation ? FALSE : TRUE);

#031 }

#032 }

#033

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读