程序切換問題

2021-04-12 11:52:30 字數 3491 閱讀 4772

基礎知識:

乙個任務的所有資訊都存放在任務狀態段中,任務狀態段與相應的段描述符相關。任務段描述符只能存放在

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.切換核心棧和硬...

程序切換與執行緒切換

為了更好的了解上下文切換,需要我們了解虛擬記憶體的概念。虛擬記憶體是作業系統為每個程序提供的一種抽象,每個程序都有屬於自己的 私有的 位址連續的虛擬記憶體,當然我們知道最終程序的資料及 必然要放到物理記憶體上,那麼必須有某種機制能記住虛擬位址空間中的某個資料被放到了哪個物理記憶體位址上,這就是所謂的...