在内存紧张的时候会回收一些物理页面,对于脏的页面,在进程的工作集中存在于修改并写回和修改不写回两种链表。 那么有一个问题是,PE加载器在加载exe或dll时,采用的是哪种页面?或者有什么特殊的处理方法?
暂时不考虑对数据区等的写时复制的页面属性,或者假设采用了SHARE区段。 因为exe或dll等的后备存储器默认的是相对应的磁盘文件,而不是页面文件。那么: 如果采用了写回页面,那么对于PE文件中的修改,包括数据区或导入表等等的变化可能就会在内存紧张或进程结束时被写回磁盘的PE文件中,导致原始PE破坏,显然不太可能。 如果采用了不写回页面,那么对于PE文件的修改在进程销毁时不会被写回磁盘,但是在内存紧张的时候(考虑极限情况),PE映射的部分页面被回收导致相关被修改的页面没有保存到磁盘中(既没有写到页面文件中,也不在相对应的磁盘文件),这样的话再次访问时由于页面错误,又从磁盘读出的是原始数据,与当前运行时的数据不一致,导致程序执行出错。
麻烦各位大牛点拨一二,多谢!
|