|
在保護模式中, 核心堆疊(ss0~ss2)是放在tss中 ,當發生CPL 切換時就會導致stack switch .
但是若有一個process 擁有2個thread(A,B) ,這2個thread都各自擁有register set,user stack,PC,kernel stack(ss0:esp0) .
若發生thread switch 從A到B, 則thread B的狀態都會被更新,
除了共用資源.
問題是當thread B 使用到CPL=0 的code 導致堆疊切換 ,但是堆疊切換
又是依照TR 暫存器裡的高速緩存部分來取得kernel stack 的ss0:esp0,
而此部分又是之前thread A 的核心堆疊 ,並不是thread B的 .(為何是thread A的核心堆疊,因為TR 沒有受到更新,而更新要task switch)
若要導致thread B 的核心堆疊在TR 中被更改, 那不就是要task switch 才會導致TR 受到更新, 但這樣就不是thread switch了,疑惑是thread B的核心堆疊是怎麼更新到TR ,而不是之前thread A的,或是說怎麼更新thread B的核心堆疊而不用task switch,這就是我的問題,不知有說的很模糊嗎?
非常感激! |
|