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