[英]thread fs segment register switching between user and kernel land
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中的第一個數據結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.