fs段寄存器如何指向TEB和KPCR。这些数据结构是保存在线程用户和内核堆栈上的吗?因此,当一个线程上下文切换发生在用户到内核的情况下,fs段reg包含一个指针,TEB被保存到线程用户堆栈上,然后指向KPCR的内核fs段寄存器被加载回fs段注册?这是fs段寄存器指向TEB和KPCR的方式吗?
答案 0 :(得分:4)
FS
寄存器在LDT
或GDT
(本地/全局段描述符表)中具有与之关联的段基址。 FS
几乎是描述符表的索引,它选择表中定义的段之一。
当您通过FS
访问内存时(使用指令中的FS
段覆盖前缀),您访问的内存的虚拟地址等于指令分段基地址。
该段基址必须与特定于线程的控制数据结构的位置一致。因此,当使用其特定的控制数据结构创建线程时,将基数设置为指向该数据。
对于同一进程中的不同线程,这些位置是不同的,因为它们都共享内存,不应该跨越彼此的结构。上下文切换只是更新FS
以指向不同的段或更新描述符表中段的基址,然后重新加载FS
,以便CPU观察到更改。
当线程从用户模式转换到内核模式时,FS
及其指向的内容是不受内核POV的限制,我希望内核重新加载FS
并指向内核的值特定于线程的数据结构。在回来的路上,应该恢复用户模式FS
。事实上,事情可能会有点复杂,但这应该会给你一个想法。
在64位模式下,您甚至可以使用SWAPGS
指令快速交换GS
寄存器的内容,在32位模式下扮演类似于FS
的角色。
答案 1 :(得分:0)
所以fs段寄存器肯定指向kpcr。查看windbg并在发出“dt nt!_kpcr”之后,kpcr中的第一个结构是NtTib或TEB中的第一个结构,因此当人们说fs指向KPCR和TEB时,fs实际上指向KPCR,TIB / TEB是KPCR中的第一个数据结构。