且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《操作系统真象还原》——0.12 cs、ds这类sreg段寄存器,位宽是多少

更新时间:2022-10-04 13:03:23

本节书摘来自异步社区《操作系统真象还原》一书中的第0章,第0.12节,作者:郑钢著,更多章节内容可以访问云栖社区“异步社区”公众号查看

0.12 cs、ds这类sreg段寄存器,位宽是多少

CPU中存在段寄存器是因为其内存是分段访问的,这是设计之初决定的,属于基因里的东西。前面已经介绍过了内存分段访问的方法,这里不再赘述。

CPU内部的段寄存器(Segment reg)如下。

(1)CS——代码段寄存器(Code Segment Register),其值为代码段的段基值。

(2)DS——数据段寄存器(Data Segment Register),其值为数据段的段基值。

(3)ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他sreg那样固定,可以额外做他用。

(4)FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值,同上,用途不固定,使用上灵活机动。

(5)GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段基值。

(6)SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值。

32位CPU有两种不同的工作模式:实模式和保护模式。

每种模式下,段寄存器中值的意义是不同的,但不管其为何值,在段寄存器中所表达的都是指向的段在哪里。在实模式下,CS、DS、ES、SS中的值为段基址,是具体的物理地址,内存单元的逻辑地址仍为“段基值:段内偏移量”的形式。在保护模式下,装入段寄存器的不再是段地址,而是“段选择子”(Selector),当然,选择子也是数值,其依然为16位宽度。

可见,在32位CPU中,sreg无论是工作在16位的实模式,还是32位的保护模式,用的段寄存器都是同一组,并且在32位下的段选择子是16位宽度,排除了段寄存器在32位环境下是32位宽的可能,综上所述,sreg都是16位宽。