文章目录
虚拟内存
前言
在8086/80186时还没有操作系统,把它称之为实地址模式。
那么怎么将地址表示出来呢?
比如:数据寄存器DS中的值是16位,要转换成20位的地址。怎么转换呢?
只要左移四位,则低四位变为0了,然后再加上IP寄存器中的偏移值,就是物理地址。
DS << 4 + IP (即偏移值)= 物理地址 没有操作系统则它的空间就称为物理空间(上图的空间)
DS(基地址) IP(偏移地址、偏移量、逻辑地址)
IP寄存器中最多存16位,则偏移量最多为2^16=64K.
因为起始位置必须是16的倍数,则整个段大小在16B-64K之间,则它的真实大小就不确定,就可能导致如果别人恶意修改这个IP寄存器中的值,则段的大小就会发生改变,进而会访问无法访问的空间。
因此为了解决这样的问题,所以我们就需要保存记录 基地址 段大小 以及 访问权限 。
所以在有了操作系统以后,就添加了 GDTR(全局段描述表寄存器) 和 LDTR(局部段描述符表寄存器)。(而因为要满足向上兼容原则,所以上述寄存器不改变)
我们这里先分析GDTR,是在内存存储的全局段描述表(相当于数组)
既然GDTR都已经存储了这些信息,那么DS、CS、SS&