把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
一个是早期实模式下,寄存器16位,地址线20位。为了用16位的寄存器寻址20位的地址,引入了段(segment)的概念,所有的段都在一个地址空间。
第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。
注意,x86 CPU的段是永远存在的,不论哪个模式,不能禁止,参看Intel开发手册。
2.访问内存空间与寄存器有啥关系啊?为什么16不能寻到1M?还有内存是不是分成四种段啊?(CS/DS/SS/ES)?段寄存器就是其管理作用吗?
寄存器是CPU内部的存储部件与内存空间没有关系,设置寄存器的原因是为了减少CPU与内存交换数据的次数,以提高计算机的工作速度。
内存空间和地址线的关系为:存储容量=2^n(n是地址线的数量),所以16根地址线只能访问2^16=64K的存储空间。
内存是分成四种段,这是考虑到程序执行时需要的四个部分。但是,内存不止四个段,只是同时最多只有四个段在工作,其他的在“睡眠”,需要时再“唤醒”。
内存分段后,内存的地址(又称物理地址)就由两部分组成:段地址和段内偏移地址,段寄存器管理的是段地址。