簡體   English   中英

線程fs段寄存器在用戶和內核之間切換

[英]thread fs segment register switching between user and kernel land

fs段寄存器如何指向TEB和KPCR。 這些數據結構是保存在線程用戶和內核堆棧上的嗎? 因此,當線程上下文切換從用戶到內核發生時,fs段reg包含一個指針,TEB被保存到線程用戶堆棧上,然后指向KPCR的內核fs段寄存器被加載回fs段注冊? 這是fs段寄存器指向TEB和KPCR的方式嗎?

FS寄存器在LDTGDT (本地/全局段描述符表)中具有與其相關聯的段基地址。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM