x86内存分段
维基百科,自由的 encyclopedia
x86架构中,存储器分段(英语:Memory Segmentation)是在不改变16位段选择符时,使用单个索引寄存器(保存了段内地址偏移值)所能够寻址的的存储器范围部分。也指在英特尔x86指令集体系结构下存储器分段的实现方式。
从8086开始到随后的各款x86架构CPU,无论是实模式还是保护模式,内存寻址时都使用16位段寄存器(segment register)。段寄存器默认使用情况为:
- 代码段寄存器CS与寄存器IP相配合获得当前线程代码执行到的内存位置;
- 数据段寄存器DS与各通用寄存器配合访问内存中的数据;
- 栈段寄存器SS与寄存器(E)SP、(E)BP配合访问线程的调用栈(call stack);
- 扩展段寄存器ES用于特定字符串指令(如MOVS或CMPS)。
- 80386引入了2个额外的段寄存器FS与GS,并无特定的硬件用途。
这些段寄存器除了有16位的可见部分,还有不可见的隐藏部分,称为描述符缓存“descriptor cache”或隐藏寄存器“shadow register”[1]。当一个段选择符(segment selector)装入段寄存器的可见部分,处理器同时也把该段描述符的其它数据装入到段寄存器的隐藏部分,这包括段开始的基地址、段长度、访问控制信息等。这些信息缓存到段寄存器中,避免了处理器在转址(translate address)时花费额外的总线周期从段选择符表中读入数据。处理器指令中可以明示使用哪些段寄存器,这将替换掉默认使用的段寄存器。[2]