请教关于段描述表的问题
对以下几个概念比较模糊,请各位高人指点.
1.段描述表在系统中是一个含有多项的表,还是就是一个6字节的一个表项.
2. 段描述符是什么含义?与段描述表有什么关系.在系统中有多少段描述符?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
对以下几个概念比较模糊,请各位高人指点.
1.段描述表在系统中是一个含有多项的表,还是就是一个6字节的一个表项.
2. 段描述符是什么含义?与段描述表有什么关系.在系统中有多少段描述符?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
1、描述符表(Descriptor Table)是一个表格,表格里每一项是描述符(Descriptor),每一个描述符(Descriptor)是 8 个字节(64位)。描述符表(Descriptor Table)里有多个描述符(Descriptor)。
描述符表有 3 种:全局描述符表(GDT)、局部描述符表(LDT)以及中断描述符表(IDT)。
2、描述符(Descriptor)定义一内存段里各种属性,包括段基地址、段长度、权限、读/写 以及其它属性。
CS的高13位就是段描述符在描述符表的索引,所以全局描述符表最多可以有2^13=8192个描述符,
在你的系统中可以自己定义有多少个描述符。一个任务包括ldt和tss两个描述符,所以一个系统最多有4096个任务。
具体可见80386 Programmer's Reference Manual
[ 本帖最后由 W.Z.T 于 2007-5-5 22:40 编辑 ]
我在自己动手写操作系统这本书看到
描述符 有以下几部分组成
1 字节的段基址,
2字节的属性
3字节的段基址
2 字节的段界限.
对这个不明白的为什么会有两个段基址?
如果楼上的大哥看过这本书的话, 顺便在帮忙看下这个概念---选择子(selector)?
谢谢.
从摆渡上找到的
段描述表保存在两个特有的寄存器中
(1)GDTR寄存器,指向全局描述表(GDT),为系统中的所有任务共用的,通常是操作系统自己用的。指向内存地址
(2)LDTR寄存器,指向LDT,每个任务一个,包含任务私有的描述符。GDT中存放了的所有的LDT对应的描述符,LDTR指向该描述符的在GDT中的索引
请问找到段描述表是通过什么方式?
个人觉得应该是 相应的段描述表的基地址+cs中高13位. 如果是这样的话, 我不明白的地方是
相应的段描述表的基地址 从那里得到的。
盼望赐教.谢谢
LDT 是可选的,TSS 属于系统管理的资源,与具体任务无关,一个系统最多有4096个任务,没有根据。
对于描述符的具体描述建议还是看看Intel或AMD文档。
段寄存器就是某个选择子
如何索引到描述符:描述符表的基地址+选择子索引*sizeof(描述符)
描述符表基地址:GDT 在 GDTR 的 BASE ADDRESS 域中。
LDT 在 LDTR 的 BASE ADDRESS 域中。
IDT 在 IDTR 的 BASE ADDRESS 域中。
TSS 在 TR 的 BASE ADDRESS 域中。
除 GDTR 和 IDTR 需要系统初始化设置外,其它需要在 GDT 中定位
一个段描述符描述的是20位的段限长和32位的段基地址还有这个段的一些属性。
你说的"两个段基址"实际上是存储在段描述符的不同位置:
16-31位是段基址的低16位,32-39位是段基址的中间8位,56-63是段基址的高8位
他们合起来运算之后就可以得到一个32位的段基址。
保护模式下的段寄存器变成了所谓的选择子,高13位(3-15)对应的是段描述符在描述符表中的索引,
也就是通过它可以找到对应的段描述符在描述符表中的位置。第3位置1表示段描述符在局部描述符表中,
每一个任务都有自己的一个局部描述符表。置0表示段描述符在全局描述符表中。第0,1位表示的是当前
特权级,cpu的保护机制会用到。
使用如下内嵌汇编就可以得到全局描述符表的地址
struct gdtr {
unsigned short limit;
unsigned long base;
} __attribute__ ((packed));
static inline get_gdt(struct gdtr *gdtr)
{
asm( "sgdt %0" : "=m"(*gdtr) );
}
[ 本帖最后由 W.Z.T 于 2007-5-6 00:23 编辑 ]
"TSS 属于系统管理的资源"这句话没看明白。tss怎么可能与具体的任务无关呢?否则进程切换时怎么保存进程的上下文?
x86体系的cpu中最多可以定位2^13=8192个描述符。在linux系统中一个任务需要有一个ldt描述符和tss描述符,所以
8192/2=4096,最多也就有4096个任务不对吗?