fs段寄存器如何指向TEB和KPCR。这些数据结构是否保存在线程的用户栈和内核栈上?所以当一个线程从用户态切换到内核态时,包含指向TEB指针的fs段寄存器被保存到线程的用户栈中,然后将指向KPCR的内核fs段寄存器加载回fs段寄存器,这是fs段寄存器指向TEB和KPCR的方式吗?
fs段寄存器如何指向TEB和KPCR。这些数据结构是否保存在线程的用户栈和内核栈上?所以当一个线程从用户态切换到内核态时,包含指向TEB指针的fs段寄存器被保存到线程的用户栈中,然后将指向KPCR的内核fs段寄存器加载回fs段寄存器,这是fs段寄存器指向TEB和KPCR的方式吗?
FS
寄存器与LDT
或GDT
(本地/全局段描述符表)中的段基址相关联。 FS
实际上是描述符表中的索引,并选择其中一个定义在表中的段。FS
(使用指令中的FS
段重写前缀)访问内存时,您将访问虚拟地址等于指令中的地址加上段基址。FS
以指向不同的段,要么更新描述符表中段的基址,然后重新加载FS
,以便CPU观察到更改。FS
及其所指向的内容为不可信。我期望内核重新加载FS
,并使用指向内核端的线程特定数据结构的值来重新加载。在返回时,应恢复用户模式FS
。实际上,事情可能会更加复杂,但这应该可以给您一个想法。SWAPGS
指令来快速交换GS
寄存器的内容,其作用类似于32位模式中的FS
。因此,fs段寄存器肯定指向kpcr。在windbg中查看并发出“dt nt!_kpcr”后,kpcr中的第一个结构是NtTib或TEB中的第一个结构,因此当人们说fs指向KPCR和TEB时,实际上fs指向KPCR,而TIB / TEB是KPCR中的第一个数据结构。