这篇是Mm的最后一篇~18号po上来就一直设为私有状态,没时间修正...
忙得都是一些恶心事情,比如说恶心的物理实验。。就是在不知原理的情况下拿着些古怪的仪器去测出一堆即使自己瞎编也不会被发现的实现数据,然后老师签字,附带大篇幅手抄的预习报告和数据处理还有课后习题,一套流程下来需要10~15个小时,真装B啊~~~
额,这学期开始的时候非常有兴趣将内核一些关键组件详细的研究一下,一直最搞不明白的就是内存管理和缓存管理的细节,所以记录详细点,其他的东西(仅指基本组件)理解还可以。。以备忘的形式慢慢po上来~
无效PTE 有四种 在辅存中、要求0页面、页面转移中、未知
2.要求0页面
跟第一种是一类,但有待分配成全为0的页面
3.页面转移中,位于物理页面中,存在一个PFN 并且正准备转出到辅存(注意:这里指一个物理页面进入备份链表,没有真正进行IO)
4.最后一种全为0 需要检查VAD 这可能是一个尚未递交的页面
原型PTE
在SEGMENT中有原型PTE的阵列,原型PTE也并不用来参与转译,有无效的PTE指向,作为一种内存管理手段(性质类似于系统PTE区)
当进程第一次引用到原型PTE区域的映射时,内存管理器利用原型PTE填充有效的物理PTE
下面是指向原型PTE的无效PTE的结构定义
原型PTE有多种状态
1. 有效 同硬件PTE
2. 位于页面文件 同第一种无效PTE
3. 位于映射文件中12~31位 是映射文件中的偏移
4. 转移中 同无效的第三种情况
5. 修改但不写出 格式同无效的第三种情况
PTE的完整类型定义是
忙得都是一些恶心事情,比如说恶心的物理实验。。就是在不知原理的情况下拿着些古怪的仪器去测出一堆即使自己瞎编也不会被发现的实现数据,然后老师签字,附带大篇幅手抄的预习报告和数据处理还有课后习题,一套流程下来需要10~15个小时,真装B啊~~~
额,这学期开始的时候非常有兴趣将内核一些关键组件详细的研究一下,一直最搞不明白的就是内存管理和缓存管理的细节,所以记录详细点,其他的东西(仅指基本组件)理解还可以。。以备忘的形式慢慢po上来~
页面交换
首先是PTE的类型
X86硬件PTE
V位如果为1,转译正常进行,V位如果为0 硬件将发生页面错误 交由系统处理
typedef struct _MMPTE_HARDWARE {
ULONG Valid : 1;
#if defined(NT_UP)
ULONG Write : 1; // UP version
#else
ULONG Writable : 1; // changed for MP version
#endif
ULONG Owner : 1;
ULONG WriteThrough : 1;
ULONG CacheDisable : 1;
ULONG Accessed : 1;
ULONG Dirty : 1;
ULONG LargePage : 1;
ULONG Global : 1;
ULONG CopyOnWrite : 1; // software field
ULONG Prototype : 1; // software field
#if defined(NT_UP)
ULONG reserved : 1; // software field
#else
ULONG Write : 1; // software field - MP change
#endif
ULONG PageFrameNumber : 20;
} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
以上是PTE有效时的定义 也就是CPU直接寻到物理地址时的定义
无效PTE 有四种 在辅存中、要求0页面、页面转移中、未知
1.在辅存中
typedef struct _MMPTE_SOFTWARE {
ULONG Valid : 1;
ULONG PageFileLow : 4; 用于索引在哪个页面文件中,页面文件的结构MMPAGING_FILE 存储在一个MmPagingFile的数组中 一共可以支持16个页面文件
ULONG Protection : 5;
ULONG Prototype : 1;
ULONG Transition : 1;
ULONG PageFileHigh : 20; 在页面文件中的偏移
} MMPTE_SOFTWARE;
2.要求0页面
跟第一种是一类,但有待分配成全为0的页面
3.页面转移中,位于物理页面中,存在一个PFN 并且正准备转出到辅存(注意:这里指一个物理页面进入备份链表,没有真正进行IO)
typedef struct _MMPTE_TRANSITION {
ULONG Valid : 1;
ULONG Write : 1;
ULONG Owner : 1;
ULONG WriteThrough : 1;
ULONG CacheDisable : 1;
ULONG Protection : 5;
ULONG Prototype : 1;
ULONG Transition : 1;
ULONG PageFrameNumber : 20;
} MMPTE_TRANSITION;
4.最后一种全为0 需要检查VAD 这可能是一个尚未递交的页面
原型PTE
在SEGMENT中有原型PTE的阵列,原型PTE也并不用来参与转译,有无效的PTE指向,作为一种内存管理手段(性质类似于系统PTE区)
当进程第一次引用到原型PTE区域的映射时,内存管理器利用原型PTE填充有效的物理PTE
下面是指向原型PTE的无效PTE的结构定义
typedef struct _MMPTE_PROTOTYPE {
ULONG Valid : 1;
ULONG ProtoAddressLow : 7;
ULONG ReadOnly : 1; // if set allow read only access.
ULONG WhichPool : 1; 再哪个换页内存池中
ULONG Prototype : 1;
ULONG ProtoAddressHigh : 21; 原型PTE所在偏移
} MMPTE_PROTOTYPE;
原型PTE有多种状态
1. 有效 同硬件PTE
2. 位于页面文件 同第一种无效PTE
3. 位于映射文件中12~31位 是映射文件中的偏移
4. 转移中 同无效的第三种情况
5. 修改但不写出 格式同无效的第三种情况
PTE的完整类型定义是
typedef struct _MMPTE {
union {
ULONG Long;
HARDWARE_PTE Flush;
MMPTE_HARDWARE Hard;
MMPTE_PROTOTYPE Proto;
MMPTE_SOFTWARE Soft;
MMPTE_TRANSITION Trans;
MMPTE_SUBSECTION Subsect;
MMPTE_LIST List; 系统PTE区用的链表
} u;
} MMPTE;