《深入理解linux内核》边读边说-内存寻址(二)
硬件中的分段
从80286模型开始,INTEL处理器添加了一种叫保护模式的东西。所以现在的CPU有两种模式:实模式(80286以前CPU运行的模式),保护模式(现代的CPU大部分时间工作的模式)。
CPU刚加电开机的时候处于实模式。这种模式下对内存的寻址是直接使用物理地址寻址。而且可寻址的空间很有限,只有1MB。
经过一定的转换机制后CPU进入保护模式(CR0寄存器的PE为置1,PE位为CR0寄存器的第0位),保护模式中,CPU的寻址能力得到扩展能使用所有的可用内从空间。
实模式存在的主要原因是为了保持和以前处理器的兼容(现在都32年过去了,还得和1978年的8086CPU保持兼容。。。。),并且让操作系统自举。
保护模式相关更多信息请看:http://en.wikipedia.org/wiki/Protected_Mode
段选择符和段寄存器
CPU中有6个段寄存器分别是:CS,DS,SS,ES,FS,GS。
这些中三个寄存器有专门的用途:
CS:代码段寄存器,可执行的指令就包含在这里,执行时SC:IP指向要执行的指令(当前执行)。
SS:栈段寄存器,程序的栈就在这个段。
DS:数据段寄存器,保存程序执行时的数据。
其他寄存器可以用做任意用途。
这里简单说一下没启用保护模式的时候分段机制。
没启用保护模式的时候段寄存器直接存储地址的高16位,而偏移表示底16位。
也就是物理地址=段寄存器*16+偏移地址
开启保护模式后段寄存器保存的就不是简单的保存物理地址高位,而是保存叫段选择符(Segment Selector)的东西。
PS:以下注意段选择符,段描述符,这两个是不同的,分别用于选择和描述一个段。
段选择符的结构如图:

