从Inter CPU体系讨论实模式与保护模式

1971年11月15日,这一天被当作全球IT界具有里程碑意义的日子而被写入许多计算机专业教科书。INTEL公司的工程师霍夫发明了世界上第一个微处理器—4004,这款4位微处理器虽然只有45条指令,而且每秒只能执行5万条指令。甚至比不上1946年世界第一台计算机ENIAC。但它的集成度却要高很多,一块4004的重量还不到一盅司。紧接着在1972年8008诞生,世界上第一款八位元处理器,拥有14位地址总线与14位数据总线.之后还有8080,8位元处理器,拥有16位地址总线和八位数据总线。8085同样也是8位处理器。至此,内存寻址访问仍是绝对地址。就是指令的地址即物理地址,中间没有任何的转换。而8080的诞生作为公认的“第一款真正可用的微处理器”。8080的架构对8086产生了很大的影响,并且为 x86系列奠定了基础,才有了我们今天要提到的实模式保护模式
在这里插入图片描述
在这里插入图片描述

实模式

1976年开始设计,1978年中旬Intel 发布了 8086。标志了x86王朝的开始。它是一款16位的微处理器,却被设计成可以访问1MB 的内存(即20位的地址空间)。问题就产生了,16位的 ALU怎么去取20位的地址呢?
8086采用段式管理,添加了CS(Code Segment代码段寄存器) DS(Data Segment数据段寄存器) SS(是 Stack Segment堆栈段寄存器)ES(Extra Segment附加段寄存器)。这四个段寄存器均为16位且存储的是当前操作的段的起始地址。由于CPU只能寻址16位,每个段的限长是64k。为了取20位的地址,8086规定,段的起始位置必须是是16的倍数,这样每个段的起始位置后四位都是0。寄存器只记录地址的高16位。现在我们只需要起始地址左移四位再加上偏移量(偏移量存在IP(指令指针寄存器Instruction Pointer)中)就可以找到物理地址啦。而这种模式就是传说中的实模式。
以DS段为例:

然而实模式有一个缺陷,通过改变段寄存器的值,我们可以随心所欲的访问内存任何一个单元,而丝毫不受到限制,不能对内存访问加以限制,也就谈不上对系统的保护。因此,在实模式下是无法构造现代意义的操作系统的。
于是乎为了解决这个问题,inter 通过了80286的过渡(尽管在Intel 80286手册中已经提出了保护模式,但实际上它只是一个指引。80286虽然有了保护模式但其依然是16位的CPU,其通用寄存器还是16位宽,只不过其地址线由20位变成了24位,即寻址空间扩大到了16MB(但受限于寄存器位宽,单个寄存器的寻址空间仍然为64KB)。80286只是一个“过渡”产品,很快就被淘汰。),发布了8038680386完全兼容先前的 8086/8088,80186,80286,并且 80386 全面支持 32 位数据类型和 32 位操作,并且 80386 的数据总线根数和地址总线根数均达到了 32 根,从而可以最大物理寻址为 232 即 4GB 。它支持实模式,也提供了保护模式

保护模式

保护模式下地址的表示方式与实模式是一样的,都是:段+偏移,不过保护模式下,“段”的概念发生了根本性的改变。实模式下,段值还是可以看作是地址的一部分,比如段值为xxxxh表示以xxxx0h开始的一段内存。而保护模式下,虽然段值仍然由原来的CS、DS等寄存器表示,但此时它仅仅变成了一个索引,这个索引指向了一个数据结构的一个表项,表项中详细定义了段的段基址,段界限,段属性等内容。这个数据结构就是段描述符GDTLDT

在这里插入图片描述
在这里插入图片描述
段选择子就是寄存器CS DS SS 中的值,其高13位即为段描述符的索引,后3位存储系统默认值
于是我们可以得到(以CS索引的GDT为例)
段基址= = GDTR[CS>>3].BaseAdress

线性地址 == 段基址 + IP(IP<=段界限)

若系统未开启分页机制,此处的线性地址就是物理地址
反之,此处的线性地址只是虚拟地址,还需要通过映射找到物理地址此处不再赘述。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43730678/article/details/88378143
今日推荐