首页
社区
课程
招聘
[求助]每个进程用拥有一个LDT吗?GDT是否会被塞满。
发表于: 2012-11-23 21:49 10571

[求助]每个进程用拥有一个LDT吗?GDT是否会被塞满。

2012-11-23 21:49
10571
若说每个进程都有一个TSS任务状态段+一个LDT,其描述符分配在GDT中。而单核CPU系统中只有一个GDT。可以存放128-1个描述符。  那么,这个GDT段描述符表的描述符空位应当随进程增加而减少。         那么windows xp是如何开启超过66个任务的?(且这张表还将被段描述符和门描述符占用)。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
2
莫不是我想象力不够。?开了N多个Notepad,仅有4个TSS段描述符。
2012-11-24 00:43
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
LDT不是全局可见的,它们只对引用它们的任务可见,每个任务最多可以拥有一个LDT。另外,每一个LDT自身作为一个段存在,它们的段描述符被放在GDT中。
IA-32为LDT的入口地址也提供了一个寄存器LDTR,因为在任何时刻只能有一个任务在运行,所以LDT寄存器全局也只需要有一个。如果一个任务拥有自身的LDT,那么当它需要引用自身的LDT时,它需要通过LLDT将其LDT的段描述符装入此寄存器。LLDT指令与LGDT指令不同的时,LGDT指令的操作数是一个32-bit的内存地址,这个内存地址处存放的是一个32-bit GDT的入口地址,以及16-bit的GDT Limit。而LLDT指令的操作数是一个16-bit的选择子,这个选择子主要内容是:被装入的LDT的段描述符在GDT中的索引值——这一点和刚才所讨论的通过段积存器引用段的模式是一样的
http://zhidao.baidu.com/question/55293031.html
2012-11-24 09:09
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
这个解释依然没有从问题角度出发、
2012-11-24 11:46
0
雪    币: 229
活跃值: (503)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
5
windows的进程地址空间隔离不是用的ldt,而是用的页目录来实现的
只是兼容16位程序部分用到了ldt,
linux貌似也没有使用ldt。。。
2012-11-24 11:57
0
雪    币: 229
活跃值: (503)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
所以你说的一个进程一个ldt  本身就是错误的
2012-11-24 11:58
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
7
windows和linux都没有使用tss和ldt,任务内存的隔离使用分页机制就足够了
2012-11-24 12:51
0
雪    币: 61
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼上两楼正解。。。windows对于tss任务状态段 也没有用。。。有些地方检测只是为了上下兼容而已,其实对于程序员没有任何意义。
2012-11-24 15:35
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
若没有使用那么cs当中的选择子应当从哪里获取对应的基址呢?不要告诉我不使用LDT后cs也不用了。。或者直接使用GDT,那是无法接受的。
2012-11-25 10:20
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
10
那没有使用tss进程切换时的寄存器又从哪来?…
2012-11-25 10:23
0
雪    币: 412
活跃值: (30)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
windows下段选择子使用的是GDT,
线程的寄存器列表是存在trap frame中的。
2012-11-25 21:07
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
12
1.CS、ES、DS、SS 若是GDT的牵引的话,我开了70多个程序,GDT的内容却并没有发生什么变化。

2.依靠Trap_frame进行线程现场保存,这个应该是进入门后发生的事情。
以此想象,如果依靠Trap_frame进行线程切换的话,线程切出的话可以理解,但是一个线程被切入,那么这个线程应该从哪里获得之前的寄存器值呢?
2012-11-25 21:46
0
雪    币: 61
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
windows没有任务切换的概念,只有线程切换的概念。不断的切换线程而已,没有任务的概念。线程切换的时候,先构建一个Trap_frame结构体,将当前线程的所以寄存器环境保存下来,以便下次执行的时候恢复。然后切换到另外一个线程(这中间还有一些其他事情,由于篇幅不想多说)。每一个线程都拥有一个Trap_frame结构,三环的时候是CONTEXT 结构,线程从0环回到三环的时候就是用Trap_frame结构去初始化CONTEXT结构。。。。。。建议楼主好好去学习,再来一争高下。。。这些东西不是人家不愿意跟你说,是因为很复杂,不是一两句能解释的清楚。。。
2012-11-26 14:26
0
雪    币: 199
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
windows 很多实现机制并不是完全用的cpu提供的东西
2012-11-26 14:31
0
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
有待商榷,最直接的问题是,如果系统不使用tss, 那么cpu从3环跳到0环的时候,此时,内核栈的地址是从哪取得?

对了,我还想知道,windows 的进程的内核栈是怎么分配的,多大,每个进程一个还是所有进程共享?
2012-11-26 18:27
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
你想得太复杂了,具体你可以去看一下wrk里的处理过程

内核栈是和线程有关的,每一个ring3线程拥一个内核栈和ring3栈
2012-11-26 19:57
0
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
恩,从理论上说,每个进程的的内核栈是独立的,确实也应该这么设计。

楼上的诸位说Windows 或者 Linux 没用到tss,那是不正确的,Windows我不晓得,但是Linux确实是用到了,值不过是用到了tss中很少的几个变量。

楼主的问题是 早期Linux内核 的问题。早期Linux内核的进程切换是靠jmp一个任务的tss选择子来实现任务切换,而这个任务的选择子就保存在gdt中。所以说,由于gdt的大小的限制,系统中的进程数也有限制。

而现代的操作系统都不这么干了,Linux 2.6的内核系统中之用到了一个全局 的tss,而每个进程的信息都保存在了自己的结构体中。系统中不用到tss是不可能的,因为intel手册中说,当CPU发生特权级转变的时候,会从当前的tss中取对应的栈地址给esp,比如说,从ring3 跳到ring0,那么cpu会从tss中的esp0域中取内核栈地址。

如果只使用一个tss,那么系统的 中进程数就可以突破gdt的大小的限制了。其实在进程环境切换到时候,都会重新设置一个这个全局tss中esp0的值,在Linux内核中,查查switch_to这个宏,确实也这么做了。至于ldt那不是必须的,Linux中的ldt是可以动态申请的。
2012-11-26 20:27
0
雪    币: 55
活跃值: (519)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
18
好的,谢谢了。终于理解了。
2012-11-27 01:02
0
游客
登录 | 注册 方可回帖
返回
//