📄 80386asm程序设计基础(十).htm
字号:
|<BR>
|_____|____________________________________________________________________________|
<BR> |0001
|只读,已访问
|<BR>
|_____|____________________________________________________________________________|<BR>
|0010
|可读,可写
|<BR>
|_____|____________________________________________________________________________|<BR>
|0011
|读写,已访问
|<BR>
|_____|____________________________________________________________________________|<BR>
|0100
|只读,向低扩展
|<BR>
|_____|____________________________________________________________________________|<BR>
|0101
|只读,向低扩展
|<BR>
|_____|____________________________________________________________________________|<BR>
|0110
|读/写,向低扩展
|<BR>
|_____|____________________________________________________________________________|<BR>
|0111
|读/写,向低扩展,已访问
| <BR>
|_____|____________________________________________________________________________|<BR>
|1000
|只执行
|<BR>
|_____|____________________________________________________________________________|<BR>
|1001
|只执行,已访问
|<BR>
|_____|____________________________________________________________________________|<BR>
|1010
|可执行,可读
|<BR>
|_____|____________________________________________________________________________|<BR>
|1011
|可执行,可读,已访问
|<BR>
|_____|____________________________________________________________________________|<BR>
|1100
|只执行,一致代码段
|<BR>
|_____|____________________________________________________________________________|<BR>
|1101
|只执行,一致代码段,已访问
|<BR>
|_____|____________________________________________________________________________|<BR>
|1110
|可执行,可读,一致代码段
|<BR>
|_____|____________________________________________________________________________|<BR>
|1111
|可执行,可读,一致代码段,已访问
|<BR>
|_____|____________________________________________________________________________|
<BR> 存储段描述符的结构可以这样定义:<BR>
DESCRIPTOR STRUCT<BR> Segment_LimitL16 DW
0;段界限的低16位 <BR> Segment_BaseL16
DW 0;段基址的低16位<BR> Segment_BaseM8 DB
0;段基址的中间8位<BR> Segment_BaseH8 DB
0;段基址的高8位<BR> Segment_Attributes DW
0;段属性<BR> DESCRIPTOR ENDS<BR>
一个任务有多个段,每个段都有一个描述符。因此在80386下,为了方便管理这些段描述符,将描述符组成一个线性表,称之为描述符表。在80386下有三种描述符表:GDT(Global
Descriptor Table),LDT(Local Descriptor Table),IDT(Interrupt
Descriptor
Table)。在整个系统中全局描述符表GDT和中断描述符表只有一张,局部描述符表可以由若干张。每个描述符表都形成一个特殊的16位数据段,这样的特殊数据段最多可以有8192个描述符,具体使用哪一个段描述符,由段的选择子来确定。每个任务都有自已的局部描述符表LDT,它包含自已的代码段,数据段,堆栈段,也包含该任务使用的一些门描述符。随着任务的切换,LDT也跟着切换。GDT包含每一个任务都可能或可以访问的段的描述符,通常包含描述操作系统所用的代码段,数据段以及堆栈段的描述符,也包含描述任务LDT的描述符。在任务切换时,并不切换GDT。一个任务的整个虚拟地址空间可以分为相等的两半,一半空间的描述符在全局描述符表GDT中,一半空的描述符在局部描述符表LDT中。由于全局描述符表和局部描述符表都可以包含最多为8192个描述符,而每个描述符所描述的段的最大长度为4G,因此最大的虚拟地址空间为:8192*4G*2=64TB。<BR>
段选择子用来确定使用描述符表中的哪一个描述符。实式模式下逻辑地址由段地址*16再加上段内偏移地址;保护模式下虚拟地址空间由段选择子和段内偏移来确定,和实式模式比较,段选择子代替了段值,实际上通过段选择子就可以确定了段基址。选择子的高13位是描述符表中的索引号,用来确定描述符,因为是13位,所以说最多可以有2的13次方8192个描述符,索引号:0-8191。标记TI指示是从全局描述符中读取描述符还是从局部描述符表中读取描述符。TI=0指示是从全局描述符表中读取描述符,TI=1指示从局部描述符表读取描述符。RPL表示请求特权级,用于特权检查。假设段选择子为88H,则表示请求的特权级别是0,从全局描述表中读取描述表,描述符的索引号为11H。有一个特殊的选择子称为空选择子,它的Index=0(即高13位为0),TI=0,RPL则可以为任意值。当用空选择子对存储器进行访问,会出现异常。空选择子对应于全局描述表中的第0个描述符,因此全局描述符表中的第0个描述符总是不会被访问。如果TI=1,那么就不是空选择子,它指定的是当前局部描述符表中的第0个描述符。为了更快地从段选择子中获得段的基本信息(段基址,段界限,段属性),从80386开始为每个段寄存器在硬件上配备了段描述符高速缓冲存储器,对我们写程序的人来讲,它是不可编程的。有了这种高速缓冲寄存器后,每当将选择子装入段寄存器后,处理器将自动装入描述符表中相应的描述符,并将描述表的信息装入到高速缓冲寄存器,这样可以加快访问速度,以下是段选择子的结构示意图:<BR>
<BR>
15________________________________________________________________3__2__1_____0 <BR>
|
|TI | RPL |<BR>
|________________________________________________________________|___|________|<BR> <BR><!--内容结束//--></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR><!--文章评论开始//-->
<TABLE cellSpacing=0 cellPadding=0 width=770 align=center bgColor=#006699
border=0>
<TBODY>
<TR bgColor=#006699>
<TD id=white align=middle bgColor=#006699><FONT
color=#ffffff>对该文的评论</FONT></TD>
<TD align=middle><!--文章人气开始//-->
<SCRIPT src="80386ASM程序设计基础(十).files/readnum.htm"></SCRIPT>
<!--文章人气开始//--></TD></TR></TBODY></TABLE><!--文章评论结束//--><BR>
<DIV align=center>
<TABLE cellSpacing=1 cellPadding=2 width=770 align=center bgColor=#cccccc
border=0>
<TBODY>
<TR>
<TH id=white bgColor=#006699><FONT
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE width=770 border=0>
<TBODY>
<TR>
<TD>你没有登陆,无法发表评论。 请先<A
href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=17480">登陆</A>
<A
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR width=770 noShade SIZE=1>
<TABLE cellSpacing=0 cellPadding=0 width=500 border=0>
<TBODY>
<TR align=middle>
<TD vAlign=bottom height=10><A
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A
href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A
href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A
href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A
href="http://www.csdn.net/english">English</A> </TD>
<TD align=middle rowSpan=3><A
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG
height=48 src="80386ASM程序设计基础(十).files/biaoshi.gif" width=40
border=0></A></TD></TR>
<TR align=middle>
<TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
<TR align=middle>
<TD vAlign=top><FONT face=Verdana>Copyright © CSDN.net, Inc. All rights
reserved</FONT></TD></TR>
<TR>
<TD height=15></TD>
<TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--结束//--></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -