写在前面

  此系列是本人一个字一个字码出来的,包括示例和实验截图。由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

  看此教程之前,问几个问题,


🔒 华丽的分割线 🔒


练习及参考

2️⃣ 自己实验有和没有DEP保护的程序,看看效果。

TLB

  CPU通过页的方式对物理内存进行了,需要通过某种运算方式才能访问真正的内存。但是,如果频繁访问某一个线性地址,每次都得通过推算到真正的物理地址然后进行读写操作,是不是挺浪费效率的?Intel就考虑到性能的问题,提供了TLB这一个机制,提供缓存提高读写效率。
  TLB的全称为Translation Lookaside Buffer,它的结构如下:

  对于TLB,给出如下说明:
  1. ATTR(属性):如果是2-9-9-12分页,属性是PDPEPDEPTE三个属性共同决定的。如果是10-10-12分页就是PDEPTE共同决定。
  2. 不同的CPU这个表的大小不一样。
  3. 只要Cr3变了,TLB立马刷新,一核一套TLB
  学到现在我们知道,操作系统的高2G映射基本不变,如果Cr3改了,TLB刷新重建高2G以上很浪费。所以PDEPTE中有个G标志位,如果G位为1刷新TLB时将不会刷新PDE/PTEG位为1的页,当TLB满了,根据统计信息将不常用的地址废弃,最近最常用的保留。
  TLB有不同的种类,用于不同的缓存目的,它在X86体系里的实际应用最早是从Intel486CPU开始的,在X86体系的CPU里边,一般都设有如下4组TLB
  第一组:缓存一般页表(4K字节页面)的指令页表缓存:Instruction-TLB
  第二组:缓存一般页表(4K字节页面)的数据页表缓存:Data-TLB
  第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存:Instruction-TLB
  第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存:Data-TLB

CPU缓存

  CPU缓存是位于CPU与物理内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。它可以做的很大,但不是TLB,它们有很大的不同。TLB存的是线性地址与物理地址的对应关系,CPU缓存存的是物理地址与内容对应关系。
  更多的细节请参考白皮书的Chapter 11 Memory Cache Control,本篇教程主要是针对内核安全层面,就不再赘述了。

PWT 与 PCD

  PWT全称为Page Write ThroughPWT = 1时,写Cache的时候也要将数据写入内存中。
  PCD全称为Page Cache DisablePCD = 1时,禁止某个页写入缓存,直接写内存。比如,做页表用的页,已经存储在TLB中了,可能不需要再缓存了。

本节练习

  俗话说得好,光说不练假把式,如下是本节相关的练习。如果练习没做好,就不要看下一节教程了,越到后面,不做练习的话容易夹生了,开始还明白,后来就真的一点都不明白了。本节练习很少,请保质保量的完成。

1️⃣ 在10-10-12分页模式下体会TLB的存在。要求:通过代码挂物理页,不能通过Windbg挂。原物理页挂完写入值读取,然后把地址换物理页继续读取,看看值是否发生变化。然后改页属性为全局页,重复上述操作。然后用INVLPG指令之后再看看值是否变化。

下一篇

  保护模式篇——中断与异常和控制寄存器

10-24 01:15