QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1355|回复: 1

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

[复制链接]
发表于 2005-5-18 10:25:31 | 显示全部楼层 |阅读模式
在保護模式中, 核心堆疊(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,這就是我的問題,不知有說的很模糊嗎?

非常感激!
发表于 2005-5-23 09:06:18 | 显示全部楼层
2.6内核已经不使用TR寄存器作任务切换了,确切的说是2.4版就不用了。你可以看看内核堆栈的结构,把进程context switch和Linux对线程的实现手段搞清楚。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 12:07 , Processed in 0.066396 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表