免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7383 | 回复: 20
打印 上一主题 下一主题

请教关于段描述表的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-05 21:42 |只看该作者 |倒序浏览
对以下几个概念比较模糊,请各位高人指点.

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

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

论坛徽章:
0
2 [报告]
发表于 2007-05-05 22:24 |只看该作者
原帖由 怪怪虎 于 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)定义一内存段里各种属性,包括段基地址、段长度、权限、读/写 以及其它属性。

论坛徽章:
0
3 [报告]
发表于 2007-05-05 22:38 |只看该作者
CS的高13位就是段描述符在描述符表的索引,所以全局描述符表最多可以有2^13=8192个描述符,
在你的系统中可以自己定义有多少个描述符。一个任务包括ldt和tss两个描述符,所以一个系统最多有4096个任务。

具体可见80386 Programmer's Reference Manual

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

论坛徽章:
0
4 [报告]
发表于 2007-05-05 22:45 |只看该作者
我在自己动手写操作系统这本书看到
描述符 有以下几部分组成
1 字节的段基址,
  2字节的属性
3字节的段基址
2 字节的段界限.

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

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

论坛徽章:
0
5 [报告]
发表于 2007-05-05 22:58 |只看该作者
原帖由 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位. 如果是这样的话, 我不明白的地方是
相应的段描述表的基地址 从那里得到的。
盼望赐教.谢谢

论坛徽章:
0
6 [报告]
发表于 2007-05-06 00:00 |只看该作者
原帖由 W.Z.T 于 2007-5-5 22:38 发表于 3楼  
CS的高13位就是段描述符在描述符表的索引,所以全局描述符表最多可以有2^13=8192个描述符,
在你的系统中可以自己定义有多少个描述符。一个任务包括ldt和tss两个描述符,所以一个系统最多有4096个任务。

具 ...


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

论坛徽章:
0
7 [报告]
发表于 2007-05-06 00:04 |只看该作者
原帖由 怪怪虎 于 2007-5-5 22:45 发表于 4楼  
我在自己动手写操作系统这本书看到
描述符 有以下几部分组成
1 字节的段基址,
  2字节的属性
3字节的段基址
2 字节的段界限.

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

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



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

段寄存器就是某个选择子

论坛徽章:
0
8 [报告]
发表于 2007-05-06 00:18 |只看该作者
原帖由 怪怪虎 于 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 中定位

论坛徽章:
0
9 [报告]
发表于 2007-05-06 00:22 |只看该作者
一个段描述符描述的是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 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-05-06 00:29 |只看该作者
原帖由 mik 于 2007-5-6 00:00 发表于 6楼  


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


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

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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP