引言 #
Intel作为作为微处理器的航头老大,一直引导CPU的进步发展,也正是因为Intel是一个有着历史包袱的企业,所以站在现代CPU看起来,有一些非常奇葩的设计遗留下来,这些设计一开始是为了兼容,慢慢的将这种兼容又发展成新的功能,把“包袱”转换成“亮点”,段设计就是其中的一个很重要的代表,要想搞懂这个设计在不同的CPU的如何保持兼容和强化,我们必须要慢慢的把CPU的历史给捋顺。
前言 #
我们要介绍第一个CPU是8086,虽然Intel前面也生产了4004、8008、8080微处理器,但是8086基本上后面所以现代化CPU始祖,Intel后面生产的CPU都对8086兼容,所以可以说段这个“祸端”就是从8086种下来的
8086作为第一款的16位处理器,由于技术的问题,出现了一个严重问题寄存器只有16位,而地址总线却有20位,要想只通过一个寄存器表达地址的值显示无法实现,所以8086采用了一个段寄存器,segment × 16+offset(CS:IP),采用这个方式就能实现20位地址索引
段设计对程序影响 #
前面简单的介绍了段设计的原因,现在我们来看看这个设计的对16位程序的影响。
兼容性 #
由于段的存在,我们设计程序的时候可以更加自由,我们可以假设我们是在任何低16位置的内存上,只有到时切换程序时候切换段就可以
安全性 #
我们可以用相同的低地址存代码和数据,只需要切换段就行,而且我们也不需要考虑数据要多少空间,代码要多少空间,以便设定跳转地址
可以说段设计是16位程序的一个很优雅的做法,但是到了32位的时候程序不行了
32位处理器的改变 #
我们知道32位处理器的诞生带来了两件事,第一个就是寄存器有32位了,说明最大内存地址可以到4G了(0x000000-0xffffff
),而且总线地址也有32位了。这个时候就很尴尬了,原来的段设计到这里就成鸡肋了。但是为了兼容,我们还是给他一个功能,段选择子,当然现代Unix操作系统没有用这个东西,只是在初始化的时候意思意思一下,具体可以看一下这篇博客的GDB
表
总结 #
最近学操作系统感觉有很多疑惑,了解很多知识,总想好好总结一下细节,结果发现总有大神们早就写出来了,而且非常详细,我就不班门弄釜了,把下面的lab好好思考,提炼出自己的知识。