Intel的X86芯片段式管理历史起源(CS、DS、ES、SS)——避免产品公司的小九九
Intel公司在1974年4月发布8080 CPU。这是一枚8位元处理器,时脉为2MHz,亦是第一枚可算得上的处理器。
注意,这里的8位、16位指的是ALU的宽度,而并不是地址线的宽度(如果CPU与地址线的宽度相同,也就不需要分段管理了)。
从设计人员的角度来讲,把地址宽度与ALU宽度设计成一样,这是最简单便捷的。但是,这显然是不合理的——8位的地址线只能寻址256位,这样的存储空间基本上什么都做不了。
所以,8位的ALU对应的是16位的地址线——寻址空间为64k,这个内存空间在上世纪70年代(1974?)来说,够用了。
1978年,8086 CPU问世(第一枚真正意义上的通用微处理器),此时,CPU已经是16位。ALU的宽度与地址线的宽度已经一致了,似乎完美的时刻到了。
不过,到1978年的时候,程序猿们觉得内存似乎还是有些小了(小?),与此同时,内存的价格也不再是天价。Intel决定把地址线的宽度再扩个容。
地址线扩成多大呢?20位,也就是说,此时的CPU寻址能力是1MB。
1MB的内存空间在现在看来,实在是很小很小。不过,在1978年的程序员看来,这实在是微处理器内存中的巨无霸了——因为1978年的小型机(如PDP-11)也就才4MB的内存空间。
可是,多出来的4位怎么弥补呢?
当时一般有如下2种方法:
1、在16位CPU内专门设计一些用于20位的指令用于地址运算和寻址。(会造成CPU内部结构特殊化,如果CPU变成32位,需要从头改造)
2、PDP-11的MMU内存管理机制。(小型机解决方案,可以寻址到24位——4MB)
Intel选择了第三种——段式管理。
Intel设计了4个新的寄存器:CS、DS、SS、ES分别用于存储指令、数据、堆栈、其他。
分段的设计模式是:把整块内存空间分割成多个(?)段,以上4个寄存器存储的是当前(记住,是当前)操作的段的起始地址。由于CPU只能寻址16位,每个段的限长是64k。16位的段地址左移四个二进制位,加上16位的段内偏移地址,得到的和就是20位的物理地址。
不过,由于段式管理是Intel在某种条件(?)下设计出来的,Linux以及大多数操作系统对段式管理基本上避而远之的。
实际上,在Linux内核里,对分段管理用得极少,而DS、SS的指向基本上也从来没有做过区分;Linux的内核也仅用了段的0级、3级权限——它并没有陷入Linux以及别的芯片厂商的设计之中,真正做到了独立性。
每一个企业造出来的CPU或者数据库或者别的什么产品,都有其本源的商业驱动力,目的都是盈利。
所以,不需要站在一个产品内部去看问题,也不要把它供起来当成祖师爷膜拜。只有把一个产品当成一个普通朋友,明白它的优点和缺陷,心思和小九九,才能得心应手、运用自如。
至于Linux是如何看透Intel的小九九,又如何避免的呢? Linux是如何做到的呢?
以后再做分析。