如果你上过微机原理课,也可能把所有的寄存器都忘了,那我说一组寄存器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个字节来存储,描述了段的基地址,段的界限,也即
段的大小,还有段的属性等。
段基地址32位,段界限20位。当G=0时,段的大小就是段界限值的字节,也即最大1M字节。一般情况下,
我们用的都是G=1,表示一个页4K,段的大小是4K*段界限值,最大是4G字节。
D=0,缺省操作数16位,D=1,缺省操作数32为。
第5个字节,存取权字节,格式:
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忽略未用
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