这里把与 PolyMeta 和 zhuzj 的讨论做份记录。
前些天 PolyMeta 和我讨论一个问题,当写一个只读页(当然这里不
包括 Copy On Write)且这个页当时正好没有物理内存对应,是
先处理缺页还是先判断页面属性?我当时听到这个问题后,第一反应
是这种情况可不可能发生,然后马上确定这种情况肯定存在。大概
总结下,其实页故障可以分为两大类,一是缺页处理,如访问时虚拟
地址没有物理地址对应(被交换出去),触发缺页中断的情况。
二是页面访问违规,如 ring 3 访问 ring 0 地址或去写只读页面等
等违规操作。其实这个问题应该分两个角度来说,一个是 CPU 一个是
OS,那么上面说的是 CPU 自动处理情况。后来 PolyMeta 写了一个
测试驱动来捕获 INT E,根据 ERROR CODE 判断,然后从 CR2 中
取得页面信息,并检查有效性。经过实验得出的结论反推,CPU 应该
是按照 ERROR CODE 的顺序来处理,也就是说在这种情况下是先处理
缺页,然后在去检查页面权限。而在 OS 这一层上,据 zhuzj 说在
linux 下是先检测页面属性,如果页面是只读情况则直接返回写失败。
我当时就想这应该是 OS 为了避免一次 page fault 所带来的开销做
的优化处理。Windows 这部分处理还没看,我想应该也有这种优化,
注意,我只是猜测,别让我误导了你。
其实这种问题要说有多少实用性?可能对写大多数驱动来说没有多少。
但用 isno 那句半玩笑的话说,这是一种精神。呵呵。
来源:
http://www.whitecell.org/forums/viewthread.php?tid=443