0
点赞
收藏
分享

微信扫一扫

到底能访问多大内存空间?从实模式到保护模式?

《深度探索 Linux 系统虚拟化 原理与实现》王柏生 机械工业出版社.

1978 年,Intel 发布了第一款 16 位微处理器 8086 这款处理器有 20 根地址线,可以支持的地址空间是 1MB(220B),但是,这款处理器的数据总线宽度是 16 位,也就是说,指令指针寄存器 IP 以及其它通用寄存器都是 16 位的,那么指令最大只能寻址 64KB(216B)空间。

支持的内存空间(地址总线宽度)和实际真的能够访问的内存地址(机器字长有关)是有区别的。

8086
为了解决这个问题,引入了段的概念(实模式)。
8086 微处理器有 4 个段寄存器 cs、ds、es、ss,每个段寄存器也是 16 位的,用于存储段的起始地址,其他寄存器存储的则是段内偏移,使用逻辑地址(结合段寄存器)来访问不能够访问到的内存空间。

到底能访问多大内存空间?从实模式到保护模式?_描述符表

逻辑地址->线性地址:到底能访问多大内存空间?从实模式到保护模式?_实模式_02

实模式下存在的问题:没有内存保护。一个程序可以访问整个 1 MB 的地址空间,它也可以访问另一个程序的数据或代码。除了程序之外,实模式对程序访问的资源、执行的指令也没有保护,任何程序都可以执行任何可能导致意外后果的 CPU 指令。

80286
80286 开始,Intel 逐渐引入了段描述符表(保护模式)。
段描述符表中的每一个描述符对应一个段,包括段的基质、段的长度限制,段的各种属性(访问权限)。段描述符表包括了 GDT 和 LDT 两个部分,GDT 存储全局的段,每个任务都有自己的 LDT,存储任务自己的段。每个段描述符长度为 64 位,相比较段寄存器只能存储段基址,段描述符可以记录更多的段信息,实现了对内存访问的保护。在有了段描述符表后,段寄存器中存储的不再是段基址,而是一个索引,用于从段描述符表中索引具体的段。


举报

相关推荐

0 条评论