首页
社区
课程
招聘
[讨论]任务段TSS作用
发表于: 2010-9-17 11:53 16222

[讨论]任务段TSS作用

2010-9-17 11:53
16222
在windows里保存线程信息不是有thread context了吗?线程切换时会通过改变tr来切换任务段吗,任务段TSS到底都有啥作用啊,望不吝赐教

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 161
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gog
2
有人知道吗
2010-9-17 11:55
0
雪    币: 161
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gog
3
自己解决吧,确实线程切换时不会切换TSS,系统中只有四个TSS段
2010-9-17 12:22
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
intel cpu 的功能,提供多任务切换硬件支持用.保留环境.

仿佛.,windows NT 用软件实现切换,并未使用cpu 的tss 切换功能
2010-9-17 12:43
0
雪    币: 388
活跃值: (707)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
intel提供的功能,防止给人家牵着鼻子走吧,所以有很多某些cpu的特性,操作系统一般都没有用!
2010-9-17 12:47
0
雪    币: 161
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gog
6
解释到位,在软件调试这本书上看到了,线程切换确实没用到TSS,不过处理NMI,#df异常会用到
2010-9-17 13:14
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
7
在保护模式下运行的所有程序在切换任务时,对于当前任务中指向TSS的段选择器将会被存储在任务寄存器中,TSS中包含有当前任务的可执行环境状态,包括通用寄存器状态,段寄存器状态,标志寄存器状态,EIP寄存器状态等等,当此项任务再次被执行时,处理器就会其原先保存的任务状态。每项任务均有其自己的 TSS,而我们可以通过STR指令来获取指向当前任务中TSS的段选择器。

直接拿Intel开发手册来瞧瞧不就知晓了
2010-9-17 16:29
0
雪    币: 254
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
有时候不能直接拿来看。这个东西就是WINDOWS 没用上,所以对照着理解的话,会撞墙
2010-9-17 20:37
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
据我所知windows和linux在实现上都没用到这个。
操作系统的实现要考虑不同平台的可移植性
x86架构越来越复杂了
2010-9-17 21:40
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
必须要有TSS。虽然windows在任务切换上是软件实现,没有依赖于cpu的任务切换机制,但某些情况下的特权改变的时候需要用到TSS。当call引发的调用门到非一致性段的时候,需要切换到ring0堆栈。而关于此堆栈的信息(ss,esp)是由另一个指针指向的,该指针被保存在TSS里。所以虽然win只利用了ring0/3两级,而且任务切换是软件切换,但也必须维护TSS用来保存ring0栈信息的指针。该指针的初始值由系统设置。
Linux同样用了TSS来维护内核堆栈,读下linux0.11源码就可以找到。
2010-9-17 23:52
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
换句话说,TSS在win/linux没有被用来做任务切换,但是仍被用来保存内核堆栈信息。所以,单凭win/linux用的软切换这一点,就否定TSS的作用是不对的。
2010-9-17 23:59
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了!
膜拜ing
2010-9-21 01:59
0
雪    币: 161
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gog
13
大拿,解释很到位
2011-9-1 11:52
0
雪    币: 692
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
其实TSS还有另一个功能,windows我不晓得,但是再linux中,确实用到了TSS。

在80X86架构中,intel最初设计TSS是来保存硬件环境,方便进程切换,在2.6以后的内核中,linux并没有使用他来进行进程切换时取得进程的硬件环境信息的。内核利用TSS有2个方面,

1.就是大家都知道的kernel mode stack,这个地址是内核从TSS里取的,当从用户模式切换到内核模式时会用到

2,就是当用户模式的程序试图读写IO端口时,CPU 会去访问TSS里存放的IO 权限位图映射,以此来判断该程序是否有权利访问该端口。
   详细说来,第一步,CPU检查eflags寄存器里的2位IOPL域,如果该值为3,CPU 就执行该访问端口的指令,如果不为3,进行下一步检查,也就是同过tr寄存器取得当前CPU的TSS,然后检查对应的权限位图映射。如果该端口在该位图映射中的位被清零,那么该指令就被执行,否则控制单元会生成一个GP异常,操作系统会处理。

在linux中,内核用tss_struct来描述TSS寄存器的值,该结构体在/arch/x86/include/asm/processor.h中定义,如下:
struct tss_struct {
	/*
	 * The hardware state:
	 */
	struct x86_hw_tss	x86_tss;

	/*
	 * The extra 1 is there because the CPU will access an
	 * additional byte beyond the end of the IO permission
	 * bitmap. The extra byte must be all 1 bits, and must
	 * be within the limit.
	 */
	unsigned long		io_bitmap[IO_BITMAP_LONGS + 1];

	/*
	 * .. and then another 0x100 bytes for the emergency kernel stack:
	 */
	unsigned long		stack[64];

} ____cacheline_aligned;


而该结构体的初始化宏为 INIT_TSS 同样也在该文件中。贴出来,代码很明白,
/*
 * Note that the .io_bitmap member must be extra-big. This is because
 * the CPU will access an additional byte beyond the end of the IO
 * permission bitmap. The extra byte must be all 1 bits, and must
 * be within the limit.
 */
#define INIT_TSS  {							  \
	.x86_tss = {							  \
		.sp0		= sizeof(init_stack) + (long)&init_stack, \
		.ss0		= __KERNEL_DS,				  \
		.ss1		= __KERNEL_CS,				  \
		.io_bitmap_base	= INVALID_IO_BITMAP_OFFSET,		  \
	 },								  \
	.io_bitmap		= { [0 ... IO_BITMAP_LONGS] = ~0 },	  \
}


其实linux是用thread_struct来保存进程的硬件环境信息的,除了常用的eax,ebx等,这些值再内核栈中
2011-9-1 14:12
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
我想问下:
1. 如果仅仅是保存内核的栈的话,是否一定要使用TSS,有没有其它地方可以保存?
2. windows下的当前的TR值总是28,大小是20ab,谁知道这20ab个字节的数据结构?如果是仅仅保存SS0和ESP0,需要这么大的空间嘛?

0: kd> dg @tr
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0028 801ed000 000020ab TSS32 Busy 0 Nb By P  Nl 0000008b
2011-11-1 09:48
0
雪    币: 161
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gog
16
kd> dt ntkrnlmp!_KTSS
   +0x000 Backlink         : Uint2B
   +0x002 Reserved0        : Uint2B
   +0x004 Esp0             : Uint4B
   +0x008 Ss0              : Uint2B
   +0x00a Reserved1        : Uint2B
   +0x00c NotUsed1         : [4] Uint4B
   +0x01c CR3              : Uint4B
   +0x020 Eip              : Uint4B
   +0x024 EFlags           : Uint4B
   +0x028 Eax              : Uint4B
   +0x02c Ecx              : Uint4B
   +0x030 Edx              : Uint4B
   +0x034 Ebx              : Uint4B
   +0x038 Esp              : Uint4B
   +0x03c Ebp              : Uint4B
   +0x040 Esi              : Uint4B
   +0x044 Edi              : Uint4B
   +0x048 Es               : Uint2B
   +0x04a Reserved2        : Uint2B
   +0x04c Cs               : Uint2B
   +0x04e Reserved3        : Uint2B
   +0x050 Ss               : Uint2B
   +0x052 Reserved4        : Uint2B
   +0x054 Ds               : Uint2B
   +0x056 Reserved5        : Uint2B
   +0x058 Fs               : Uint2B
   +0x05a Reserved6        : Uint2B
   +0x05c Gs               : Uint2B
   +0x05e Reserved7        : Uint2B
   +0x060 LDT              : Uint2B
   +0x062 Reserved8        : Uint2B
   +0x064 Flags            : Uint2B
   +0x066 IoMapBase        : Uint2B
   +0x068 IoMaps           : [1] _KiIoAccessMap
   +0x208c IntDirectionMap  : [32] UChar
2012-1-5 15:33
0
雪    币: 207
活跃值: (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
win10 1607是这样的:
nt!_KTSS64
   +0x000 Reserved0        : Uint4B
   +0x004 Rsp0             : Uint8B
   +0x00c Rsp1             : Uint8B
   +0x014 Rsp2             : Uint8B
   +0x01c Ist              : [8] Uint8B
   +0x05c Reserved1        : Uint8B
   +0x064 Reserved2        : Uint2B
   +0x066 IoMapBase        : Uint2B
2020-6-8 13:48
0
游客
登录 | 注册 方可回帖
返回
//