当先锋百科网

首页 1 2 3 4 5 6 7

段寄存器与CPU的内存寻址密码切相关,请参见(汇编的12种寻址方式)

早在16位的8086CPU时代,内存资源宝贵,CPU使用分段式内存寻址技术:

一口气看完45个寄存器,CPU核心技术大揭秘

 

16位的寄存器能寻址的范围是64KB,通过引入段的概念,将内存空间划分为不同的区域:分段,通过段基址+段内偏移段方式来寻址。

这样一来,段的基地址保存在哪里呢?8086CPU专门设置了几个段寄存器用来保存段的基地址,这就是段寄存器段的由来。

段寄存器也是16位的。

段寄存器有下面6个,前面4个是早期16位模式就引入了,到了32位时代,又新增了fs和gs两个段寄存器。

cs: 代码段

ds: 数据段

ss: 栈段

es: 扩展段

fs: 数据段

gs: 数据段

段寄存器里面存储的内容与CPU当前工作的内存寻址模式紧密相关。

当CPU处于16位实地址模式下时,段寄存器存储段的基地址,寻址时,将段寄存器内容左移4位(乘以16)得到段基地址+段内偏移得到最终的地址。

当CPU工作于保护模式下,段寄存器存储的内容不再是段基址了,此时的段寄存器中存放的是段选择子,用来指示当前这个段寄存器“指向”的是哪个分段。

注意我这里的指向打了引号,段寄存器中存储的并不是内存段的直接地址,而是段选择子,它的结构如下:

一口气看完45个寄存器,CPU核心技术大揭秘

 

16个bit长度的段寄存器内容划分了三个字段:

PRL: 特权请求级,就是我们常说的ring0-ring3四个特权级。

TI: 0表示用的是全局描述符表GDT,1表示使用的是局部描述符表LDT。

Index: 这是一个表格中表项的索引值,这个表格叫内存描述符表,它的每一个表项都描述了一个内存分段。

这里提到了两个表,全局描述符表GDT和局部描述符表LDT,关于这两个表的介绍,下面介绍描述符寄存器时再详述,这里只需要知道,这是CPU支持分段式内存管理需要的表格,放在内存中,表格中的每一项都是一个描述符,记录了一个内存分段的信息。

保护模式下的段寄存器和段描述符到最后的内存分段,通过下图的方式联系在一起:

一口气看完45个寄存器,CPU核心技术大揭秘

 

 

通用寄存器、段寄存器、标志寄存器、指令寄存器,这四组寄存器共同构成了一个基本的指令执行环境,一个线程的上下文也基本上就是这些寄存器,在执行线程切换的时候,就是修改这些寄存器的内容。

一口气看完45个寄存器,CPU核心技术大揭秘