请教关于段描述表的问题

发布于 2022-09-29 03:16:42 字数 121 浏览 21 评论 0

对以下几个概念比较模糊,请各位高人指点.

1.段描述表在系统中是一个含有多项的表,还是就是一个6字节的一个表项.

2. 段描述符是什么含义?与段描述表有什么关系.在系统中有多少段描述符?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

装迷糊 2022-10-06 03:16:42

原帖由 怪怪虎 于 2007-5-5 21:42 发表于 1楼  
对以下几个概念比较模糊,请各位高人指点.

1.段描述表在系统中是一个含有多项的表,还是就是一个6字节的一个表项.

2. 段描述符是什么含义?与段描述表有什么关系.在系统中有多少段描述符?

1、描述符表(Descriptor Table)是一个表格,表格里每一项是描述符(Descriptor),每一个描述符(Descriptor)是 8 个字节(64位)。描述符表(Descriptor Table)里有多个描述符(Descriptor)。
    描述符表有 3 种:全局描述符表(GDT)、局部描述符表(LDT)以及中断描述符表(IDT)。

2、描述符(Descriptor)定义一内存段里各种属性,包括段基地址、段长度、权限、读/写 以及其它属性。

小女人ら 2022-10-06 03:16:42

CS的高13位就是段描述符在描述符表的索引,所以全局描述符表最多可以有2^13=8192个描述符,
在你的系统中可以自己定义有多少个描述符。一个任务包括ldt和tss两个描述符,所以一个系统最多有4096个任务。

具体可见80386 Programmer's Reference Manual

[ 本帖最后由 W.Z.T 于 2007-5-5 22:40 编辑 ]

小傻瓜 2022-10-06 03:16:42

我在自己动手写操作系统这本书看到
描述符 有以下几部分组成
1 字节的段基址,
  2字节的属性
3字节的段基址
2 字节的段界限.

对这个不明白的为什么会有两个段基址?

如果楼上的大哥看过这本书的话, 顺便在帮忙看下这个概念---选择子(selector)?
谢谢.

好久不见√ 2022-10-06 03:16:42

原帖由 W.Z.T 于 2007-5-5 22:38 发表于 3楼  
CS的高13位就是段描述符在描述符表的索引,所以全局描述符表最多可以有2^13=8192个描述符,
在你的系统中可以自己定义有多少个描述符。一个任务包括ldt和tss两个描述符,所以一个系统最多有4096个任务。

具 ...

从摆渡上找到的

段描述表保存在两个特有的寄存器中
(1)GDTR寄存器,指向全局描述表(GDT),为系统中的所有任务共用的,通常是操作系统自己用的。指向内存地址
(2)LDTR寄存器,指向LDT,每个任务一个,包含任务私有的描述符。GDT中存放了的所有的LDT对应的描述符,LDTR指向该描述符的在GDT中的索引

请问找到段描述表是通过什么方式?
个人觉得应该是  相应的段描述表的基地址+cs中高13位. 如果是这样的话, 我不明白的地方是
相应的段描述表的基地址 从那里得到的。
盼望赐教.谢谢

迟月 2022-10-06 03:16:42

原帖由 W.Z.T 于 2007-5-5 22:38 发表于 3楼  
CS的高13位就是段描述符在描述符表的索引,所以全局描述符表最多可以有2^13=8192个描述符,
在你的系统中可以自己定义有多少个描述符。一个任务包括ldt和tss两个描述符,所以一个系统最多有4096个任务。

具 ...

LDT 是可选的,TSS 属于系统管理的资源,与具体任务无关,一个系统最多有4096个任务,没有根据。

A君 2022-10-06 03:16:42

原帖由 怪怪虎 于 2007-5-5 22:45 发表于 4楼  
我在自己动手写操作系统这本书看到
描述符 有以下几部分组成
1 字节的段基址,
  2字节的属性
3字节的段基址
2 字节的段界限.

对这个不明白的为什么会有两个段基址?

如果楼上的大哥看过这本书的话 ...

对于描述符的具体描述建议还是看看Intel或AMD文档。

段寄存器就是某个选择子

原谅我要高飞 2022-10-06 03:16:42

原帖由 怪怪虎 于 2007-5-5 22:58 发表于 5楼  

请问找到段描述表是通过什么方式?
个人觉得应该是  相应的段描述表的基地址+cs中高13位. 如果是这样的话, 我不明白的地方是
相应的段描述表的基地址 从那里得到的。

如何索引到描述符:描述符表的基地址+选择子索引*sizeof(描述符)
描述符表基地址:GDT 在 GDTR 的 BASE ADDRESS 域中。
                LDT 在 LDTR 的 BASE ADDRESS 域中。
                IDT 在 IDTR 的 BASE ADDRESS 域中。
                TSS 在 TR 的 BASE ADDRESS 域中。

除 GDTR 和 IDTR 需要系统初始化设置外,其它需要在 GDT 中定位

度的依靠╰つ 2022-10-06 03:16:42

一个段描述符描述的是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 编辑 ]

心碎无痕… 2022-10-06 03:16:42

原帖由 mik 于 2007-5-6 00:00 发表于 6楼  

LDT 是可选的,TSS 属于系统管理的资源,与具体任务无关,一个系统最多有4096个任务,没有根据。

"TSS 属于系统管理的资源"这句话没看明白。tss怎么可能与具体的任务无关呢?否则进程切换时怎么保存进程的上下文?

x86体系的cpu中最多可以定位2^13=8192个描述符。在linux系统中一个任务需要有一个ldt描述符和tss描述符,所以
8192/2=4096,最多也就有4096个任务不对吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文