基礎知識:
乙個任務的所有資訊都存放在任務狀態段中,任務狀態段與相應的段描述符相關。任務段描述符只能存放在
gdt中,
tr暫存器
16位可見部分存放
tss段選擇符。
在任務切換過程中,首先,處理器中各暫存器的當前值被自動儲存到
tr所指定的
tss中;然後,下一任務的
tss的選擇子被裝入
tr;最後,從
tr所指定的
tss中取出各暫存器的值送到處理器的各暫存器中。由此可見,通過在
tss中儲存任務現場各暫存器狀態的完整映象,實現任務的切換。
在system_call.s中:
reschedule:
pushl $ret_from_sys_call
jmp _schedule
在schedule
中並沒有執行
iret
,那麼程式是怎麼在完成
schedule
的呼叫後,跳到
ret_from_sys_call
中執行的?
是不是在執行
switch_to(next)
中的"ljmp %0/n/t"
切換到新的程序,以後再切換到當前程序後,則繼續執行
switch_to(next)
中以下的語句。執行完
switch_to
後返回到
ret_from_sys_call
,然後執行
iret
返回程序
0的使用者態,
for(;;) pause()。
拿由程序
0的使用者態切換到程序
1為例:程序
0執行系統呼叫
fork(),
在system_call.s
中呼叫完
sys_fork
後,此時執行
reschedule:
pushl $ret_from_sys_call
jmp _schedule
在schedule
中執行switch_to(next)
的"ljmp %0/n/t"
切換到新的程序
1的使用者態。(因為程序1
使用者態程式、資料、堆疊,
tast_struct
中的tss
結構。都是拷貝程序
0的,而
tss中的cs:
ip要執行的則是判斷
fork()
的返回值),因為在程序1中
fork()
的返回值為
0,所以執行
init()
;執行完後,通過
tss中的連線字段回到
程序中switch_to(next)
中"ljmp %0/n/t"
以下的語句。執行完
switch_to
後返回到
ret_from_sys_call
。然後執行
iret
返回程序
0的使用者態,
在程序1
中fork()
的返回值為
1,執行
for(;;) pause()
。補充:
schedule
()schedule()函式
首先對所
有任務(
程序)進行
檢測,喚醒任何一個已經得到信號的任務。具體
方法是 針對任務
陣列中的
每個任務,
檢查其報
警定時值
alarm
。如果任務的
alarm 時
間已經過期(alar
m<
jiffies), 則在它
的訊號位
圖中設定s
igalr
m訊號,
然後清ala
rm值。
jiffie
s是系統從開
機開始算起
的滴答數
(10ms
/ 滴答)。在
sched.h 中定
義。如果進
程的訊號
點陣圖中除去
被阻塞的
訊號外還
有其它訊號
,並且任
務處於 可中斷睡
眠狀態(
task_inte
rruptib
le),則置任務為
就緒狀態
(task_runn
ing)。
隨後是排程
函式的核
心處理部分
。這部分代碼根據程序的時間片和優先權調度機制,來選擇隨後要 執行的任務。它首
先迴圈檢查
任務陣列
中的所有
任務,根據
每個就緒
態任務剩餘
執行時間
的值counter
, 選取該值
最大的一
個任務,並
利用switch_to()函式
切換到該任
務。若所
有就緒態任
務的該值
都等於零
, 表示此刻
所有任務
的時間片都
已經執行
完,於是
就根據任務
的優先權值
priority
,重置每個任
務的執行時 間片值
counter,再
重新執行迴圈
檢查所有
任務的執
行時間片值
。
程序切換和執行緒切換
為了控制程序的執行,核心必須有能力掛起正在cpu上執行的程序,並恢復以前掛起的某個程序的執行。這種行為被稱為程序切換 process switch 任務切換 task switch 或上下文切換 content switch 原文 程序切換分兩步 1.切換頁目錄以使用新的位址空間 2.切換核心棧和硬...
程序切換與執行緒切換
原文 為了控制程序的執行,核心必須有能力掛起正在cpu上執行的程序,並恢復以前掛起的某個程序的執行。這種行為被稱為程序切換 process switch 任務切換 task switch 或上下文切換 content switch 程序切換分兩步 1.切換頁目錄以使用新的位址空間 2.切換核心棧和硬...
程序切換與執行緒切換
為了更好的了解上下文切換,需要我們了解虛擬記憶體的概念。虛擬記憶體是作業系統為每個程序提供的一種抽象,每個程序都有屬於自己的 私有的 位址連續的虛擬記憶體,當然我們知道最終程序的資料及 必然要放到物理記憶體上,那麼必須有某種機制能記住虛擬位址空間中的某個資料被放到了哪個物理記憶體位址上,這就是所謂的...