段描述符和段选择符解析

 如果你上过微机原理课,也可能把所有的寄存器都忘了,那我说一组寄存器CS:IP,你好像有那么一点

印象。在我们的印象中,CS(Code Segment)是代码段,IP(Instruction Pointer)指令指针,指向代码段

的偏移,两者组合指向了运行的地址。以前的裸机程序,这样是正确的。但是如果你正在接触Linux等操作

系统的话,CS就不是这个意义了,它可能变成可段选择符。

  先说一下为什么运行裸机和运行操作系统时候CS意义为什么会不一样。CPU开机启动是运行在实模式,

此时CS就是代码段,IP就是偏移地址,这是我们熟悉的。但是当运行操作系统的时候,必须实现页保护机制,

此时就必须运行在保护模式下。CR0寄存器的第0位PE(Protect Mode Enable),置1是保护模式,清0是实

模式。

  在保护模式下,CS就不再是代码段的地址了,而是代码段的选择符,,即Selector。它指向全局或者局部

描述符表中的代码段描述符。

                                          15                                                           3     2         1    0

                                                                    索引                                     TI          RPL

[1:0]位 RPL (Requestor Privilege Level) 请求者特权级,00内核级,11用户级

[2]位  TI (Table Index)TI=0,选择全局描述符表,TI=1,选择局部描述符表

[15:3] Index 索引值。如果TI=0,则到全局描述符表中索引某一项

  假设CS=0000,1000b,则运行在内核特权级,指向全局描述符表的第一项(从第0项开始)。第一项开始

的8个字节存储的就是段描述符。

  顾名思义,段描述符是对段的详细描述,用8个字节来存储,描述了段的基地址,段的界限,也即

段的大小,还有段的属性等。

                                                 
                                                       图1     段描述符的格式

段基地址32位,段界限20位。当G=0时,段的大小就是段界限值的字节,也即最大1M字节。一般情况下,

我们用的都是G=1,表示一个页4K,段的大小是4K*段界限值,最大是4G字节。

D=0,缺省操作数16位,D=1,缺省操作数32为。

第5个字节,存取权字节,格式:

                                                    
                                                            图2 存取权字节格式

P(Present): 表示这个,段是否在内存中。P=1,段在内存中;P=0不在内存中,可能存在硬盘上。

DPL (Descriptor Privilege Level ):值0-3。表示段的保护等级。

S(System):表示是系统段还是用户段。s=0是表示是系统段描述符,指向的是中端描述符表、异常

描述符表等。s=1表示的是用户段描述符,代码段、数据段都是用户段。先讨论s=1是用户段的情况。

用户段又分为代码段和数据段,当第3为0时候表示数据段,如图3。第3位为1表示代码段,如图4。

数据段和代码段由于需要描述的属性不同,所以对第1位和第2位又分别赋予了不同的属性。


                                                      

                                                                       图3 数据段存取字节

ED=0,地址增大方向扩展;ED=1,地址减小方向扩展

W=0,数据段不能写,W=1,数据段可写

A忽略未用

                                                       
                                                                       图4 代码段存取字节

C=0,非一致代码段,当前特权级CPL=DPL才能去访问;

C=1,一致代码段,CPL>=DPL也可以访问,访问特权级仍然是CPL

R=0,代码段不可读,可执行;R=1,代码段可读可执行

A忽略未用

  以上讨论是在第四位S=1时,当S=0,时,表示系统段描述符,整个描述符表又和上面有很大差异。

因为系统段描述符用的很少,而且及其关键,所以我们一般都不会去动它。所以默认情况下说段描述符

都是上面那种情况。

系统段描述符对应操作系统中的异常描述符表和中断描述符表。其一般格式如图5:

                                                             

                                                                         图5 系统段描述符

第5个字节中的类型对应表1:

                      

                                                                            表1 系统段类型

  系统段描述符和段描述符(实际是用户段描述符,一般省掉用户)的区别就在第5个字节的类型,其它位

意义都是相同的。表一中,类型号=0xF。对应的陷阱门,和异常中断服务程序关联起来,CPU遇到一些异常

错误,如除0错误、缺页错误等就会找到相应的异常服务程序。

类型号=0xE,就是对应的中断描述符表中的中断服务程序,这个我们比较熟悉,如时钟中断,外设的硬盘

中断,usb中断等。


总结

段选择符只是一个索引,指向对应的段描述符。段描述符才是描述这个段信息的全部。
————————————————
版权声明:本文为CSDN博主「ToureYaya」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/charliewangg12/article/details/38117055

发布了9 篇原创文章 · 获赞 1 · 访问量 6682

猜你喜欢

转载自blog.csdn.net/u014426028/article/details/103804536