Chinaunix

标题: 【求助】关于386的LDT和TSS的问题 [打印本页]

作者: 通用寄存器    时间: 2005-10-16 21:17
标题: 【求助】关于386的LDT和TSS的问题
各位大虾,小弟最近学习《UNIX系统下的80386》(一本老书)一书,在学习有关任务切换时,书中有如下一段话
“虽然在UNIX系统中有大量的进程,但只有一个进程(在单处理器系统中)是当前进程,于是在GDT中,没有必要为每一个进程设置一个LDT描述符和TSS描述符,而只要有一个当前进程的LDT描述符和TSS描述符,且它们的选择子是固定的,只要在进程切换之前,用新进程的LDT描述符和TSS描述符替换掉在GDT中的老的进程的LDT描述符和TSS描述符就可以了。”

按照上面的说法,是不是LDT描述符和TSS描述符在GDT中是固定的?在下面的注释中,似乎LDT描述符是GDT中的第40项,TSS描述符是GDT中的第46项,但是CPU中有LDTR和TR两个寄存器,这两个寄存器是用来指定LDT描述符和TSS描述符在GDT中的位置的,如果LDT描述符和TSS描述符在GDT中是固定的,那么这两个寄存器不就没有存在的必要了吗?

而且该书还称“从80386来说,只要用新任务的TSS描述符的选择子加载任务寄存器TR,就实现了任务切换” TSS描述符的位置都固定了,不同进程的TSS描述符的选择子还有区别吗?

知道的XD解释一下哈,小弟谢了先!
作者: dzbjet    时间: 2005-10-17 09:41
标题: 【求助】关于386的LDT和TSS的问题
说的没错,早期的linux内核中,在GDT表中,是每一个进程占用2项GDT条目,一个是LDT,一个是TSS。而在以后的版本中(看《深入理解linux内核-第二版》),只是占有一对,且选择子固定,每当进程切换时,会重新设置LDT的内容和TSS的内容为要切换到进程的LDT和TSS。
作者: 通用寄存器    时间: 2005-10-17 12:30
标题: 【求助】关于386的LDT和TSS的问题
[quote]原帖由 "dzbjet"]说的没错,早期的linux内核中,在GDT表中,是每一个进程占用2项GDT条目,一个是LDT,一个是TSS。而在以后的版本中(看《深入理解linux内核-第二版》),只是占有一对,且选择子固定,每当进程切换时,会重新设置LDT?.........[/quote 发表:


谢谢这位师兄!我没有你说的那本书哈,你说的占有一对,一对是两个吗?还有就是既然位置已经固定了还拿TR和LDTR来干什么呢?而且切换TR就是切换任务,而TR值应该是不变的哈,小弟不是很明白,师兄讲详细点哈
作者: bhpang2    时间: 2005-10-17 16:00
标题: 【求助】关于386的LDT和TSS的问题
TR,选择子的位置固定但它的内容要变的啊
作者: 通用寄存器    时间: 2005-10-17 17:49
标题: 【求助】关于386的LDT和TSS的问题
[quote]原帖由 "bhpang2"]TR,选择子的位置固定但它的内容要变的啊[/quote 发表:


内容变化的我觉得应该是TR所指向的TSS描述符的内容哈,TR本身存放的只是相当于一个选择子,而TSS描述符在GDT中位置不变,那么标志描述符的选择子就应该不变,不知是不是这样的啊
作者: xw009    时间: 2005-10-17 19:24
标题: 【求助】关于386的LDT和TSS的问题
TSS描述符也应该不会变吧,变得应该是其指向的TSS段内容吧
请指教
作者: albcamus    时间: 2005-10-17 20:54
标题: 【求助】关于386的LDT和TSS的问题
原帖由 "xw009" 发表:
TSS描述符也应该不会变吧,变得应该是其指向的TSS段内容吧
请指教


别的Unix不知道,Linux根本不使用Intel的那套任务切换机制。

Intel的意思是想,没个进程一个TSS数据结构,由TR寄存器指向,等到切换任务时,只要使TR指向新任务的TSS就行了;而Linux是全局用一个TSS──确切的说,在SMP中,是每个CPU一个TSS──所有的进程有关的东西,都放在自己的内核栈里边,TSS->;esp0就指到进程的内核栈,切换任务时,只要根据TR取出TSS的esp0域的值就可以知道所有需要的信息了。

Linux的这种实现方式更加灵活,也更高效。Intel的设计太复杂了。
作者: 通用寄存器    时间: 2005-10-18 11:42
标题: 【求助】关于386的LDT和TSS的问题
原帖由 "xw009" 发表:
TSS描述符也应该不会变吧,变得应该是其指向的TSS段内容吧
请指教


应该要变吧,TSS描述符中放的是关于TSS段的基址、段限。权限一类的东西,TSS段在内存中的位置不是固定的吧,段限、权限不同的任务的TSS也不同吧
作者: 通用寄存器    时间: 2005-10-18 12:08
标题: 【求助】关于386的LDT和TSS的问题
原帖由 "albcamus" 发表:


别的Unix不知道,Linux根本不使用Intel的那套任务切换机制。

Intel的意思是想,没个进程一个TSS数据结构,由TR寄存器指向,等到切换任务时,只要使TR指向新任务的TSS就行了;而Linux是全局用一个TSS──确切?.........


内核栈中存放的是当前的进程信息还是所有的进程的信息啊,那么TR、TSS中的值都是固定不便的了?旧进程的信息保存倒内核栈、新进程的信息重内核栈中取出?小弟不是很明白,斑竹大人讲详细点哈!
作者: albcamus    时间: 2005-10-18 12:11
标题: 【求助】关于386的LDT和TSS的问题
>;>;内核栈中存放的是当前的进程信息还是所有的进程的信息啊
每个进程一个内核栈

>;>;那么TR、TSS中的值都是固定不便的了
没错

>;>;旧进程的信息保存倒内核栈、新进程的信息重内核栈中取出?
正是
作者: 通用寄存器    时间: 2005-10-18 16:59
标题: 【求助】关于386的LDT和TSS的问题
原帖由 "albcamus" 发表:
>;>;内核栈中存放的是当前的进程信息还是所有的进程的信息啊
每个进程一个内核栈

>;>;那么TR、TSS中的值都是固定不便的了
没错

>;>;旧进程的信息保存倒内核栈、新进程的信息重内核栈中取出?
?.........


谢谢斑竹哈,是我自己搞晕了,每个进程都有自己的内核栈,那么LINUX的任务切换中还有没有关于TR的存取的指令?比如说LTR?如果有的话每次写入TR的值应该是一样的,相当于是对CPU的一种欺骗手段了?
作者: albcamus    时间: 2005-10-18 17:12
标题: 【求助】关于386的LDT和TSS的问题
>;>;那么LINUX的任务切换中还有没有关于TR的存取的指令?比如说LTR?如果有的话每次写入TR的值应该是一样的,相当于是对CPU的一种欺骗手段了?

完全没有。如果我没理解错的话,Linux自打系统引导之后,每个CPU的TR就永不改变了。
作者: 通用寄存器    时间: 2005-10-19 10:54
标题: 【求助】关于386的LDT和TSS的问题
呵呵,多谢各位老大的讲解哈!小弟多谢了!
作者: Solaris12    时间: 2005-10-19 13:37
标题: 【求助】关于386的LDT和TSS的问题
[quote]原帖由 "albcamus" 发表:


别的Unix不知道,Linux根本不使用Intel的那套任务切换机制。

Intel的意思是想,没个进程一个TSS数据结构,由TR寄存器指向,等到切换任务时,只要使TR指向新任务的TSS就行了;而Linux是全局用一个TSS──确切




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2