内存管理-----虚拟内存
前言 在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(ES)这些寄存器做什么呢? 存储 段描述符表的下标 段描述符表的类别 以及权限位 当操作系统启动时,默认占据12个描述符表项,而用户进程最多只能用8192