1.程序切換是指:儲存prev程序的上下文,用next的上下文替代。
其中上下文包括:頁全域性目錄、核心態堆疊、硬體上下文。
2.80x86為程序切換提供的硬體支援:
第一種:通過任務門
第二種:通過jmp和call指令:把硬體上下文存在tss中,執行這條指令時,通過硬體自動切換tss,完成硬體上下文的過程
tss是任務狀態段,只能存放在gdt中,不能存放在ldt中
3.linux使用的硬體上下文切換方法:
通過一組mov指令逐步執行切換,手動模擬1的過程
因為這樣效率較高,也便於各種檢查和保護
4.linux的程序切換不使用80x86提供的硬體方法,但是為了與80x86相容,仍會為每個cpu建立乙個tss(按照80x86,應該是為每個程序建立乙個),供當前執行的程序使用。
每當切換程序時,更新tss中的內容(按照80x86,應該是切換tss)
5.核心堆疊與硬體上下文的切換是由巨集switch_to()完全的,這段程式短小精悍,很重要。可惜彙編沒學好
(1)把prev和next的值分別儲存到eax和edx中
(2)把eflags和ebp的內容儲存到prev核心棧中
(3)esp的內容儲存到prev->thread.esp中
(4)next->thread.esp的內容裝入esp中//從現在開始,當前堆疊是next的核心堆疊
(5)把標記為1的位址存入prev->thread.eip
(7)把next->thread.eip的值壓入next的核心堆疊//這個值往往是標記為1的位址,這是最後入棧的,因此從下面的乙個呼叫返回後,會執行標記為1的程式
(8)__switch_to():主要是針對tss的操作,見6
(9)標號為1的指令:彈出eflags和ebp
(10)將eax的內容拷貝到last標識的區域中
switch_to(prev, next, last)
這個函式有三個引數,
第乙個引數和第二引數都是輸入引數,分別表示被替換的程序和新的程序的位置。
第三個引數是輸出引數,記錄被替換的程序被替換到的位置,見程式中的eax
6.__switch_to()
(1)有選擇地儲存prev_p的fpu、mmx、xmm等暫存器
(2)把next_p->thread.esp0裝入tss的esp0中
(3)把next_p程序使用的執行緒區域性儲存段裝入本地cpu的gdt
(4)載入next程序的fs段和gs段
(5)更新tss的i/o點陣圖
(6)ret,返回到棧中標號為1的指令
Linux2 6 程序搶占和上下文切換
上下文切換,也就是從乙個可執行程序切換到另乙個可執行程序,由定義在kernel sched.c中的context switch 函式負責處理。每當乙個新的程序被選出來準備投入執行的時候,schedule 就會呼叫該函式。它完成了兩相基本工作 1.呼叫宣告在中的switch mm 該函式負責把虛擬記憶...
Linux 2 6 驅動模板
obj m vs10xx.o vs10xx objs vs10xx.o kerneldir home kerson linux 2.6.39 pwd shell pwd modules make c kerneldir m pwd modules cp vs10xx.ko armnfs phony ...
Linux2 6系統呼叫
一 引入系統呼叫 1.概念 作業系統為在使用者態執行的程序與硬體裝置進行交到提供了一組介面。linux通過向核心發出系統呼叫來實現這些介面 2.作用 對硬體裝置操作的程式設計更容易 提高了系統的安全性 使程式更有可移植性 3.進入系統呼叫的兩種方法 1 int 0x80彙編指令 2 sysenter...