superstition 发表于 2005-5-18 10:25:31

[請益]linux on x86 threads核心堆疊切換

在保護模式中, 核心堆疊(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,這就是我的問題,不知有說的很模糊嗎?

非常感激!

puretears 发表于 2005-5-23 09:06:18

2.6内核已经不使用TR寄存器作任务切换了,确切的说是2.4版就不用了。你可以看看内核堆栈的结构,把进程context switch和Linux对线程的实现手段搞清楚。
页: [1]
查看完整版本: [請益]linux on x86 threads核心堆疊切換