首先上header file
每個任務都有兩個堆棧,分别用于使用者态和核心态程式的執行,并且分别稱為使用者态堆棧和核心态堆棧。處于不同的cpu特權級中,這兩個堆棧之間的主要差別在于任務的核心态堆棧很小,所儲存的數量最多不能超過4096-任務資料結構塊個位元組,大約為3k,而任務的使用者态堆棧卻可以在使用者的64m空間内延伸。

關于show_task讨論的一些文章
http://www.oldlinux.org/oldlinux/viewthread.php?tid=12182
http://www.oldlinux.org/oldlinux/viewthread.php?tid=14683
在核心中的排程程式用于選擇系統中下一個要運作的程序。這種選擇運作機制是多任務作業系統的基礎。排程程式可以看作為處于運作狀态都程序之間配置設定cpu運作時間的管理代碼。linux程序是搶占式的,但被搶占的程序仍處于task_running狀态,隻是暫時沒有被cpu運作。程序的搶占發生在程序處于用于态執行階段,在核心态執行時是不能被強制的。(0.12的不可以,貌似現在的可以了)
schdule()函數首先掃描任務數組,通過比較每個就緒狀态任務的運作時間遞減滴答計數counter的值來确定目前哪個程序運作的時間最少,哪個counter值最大,就表示運作時間還不長,于是就選中該程序,并使用任務切換宏函數到該程序運作。
每當選擇出一個新的可以運作的程序時,switch_to()宏執行實際程序切換操作。該宏會把cpu的目前程序狀态(context)切換成新程序的狀态。
在切換之前,switch_to首先檢查要切換的程序是否就是目前程序。如果是,啥也别做,直接退出。如果不是,就把核心全局變量current置為新任務的指針。然後ljmp 長跳轉到新任務的狀态段tss組成的位址處,造成cpu執行任務切換操作。此時,cpu會把其所有寄存器的狀态儲存到目前任務寄存器tr中tss段選擇所指向的目前程序任務資料結構,然後把新任務狀态段選擇符所指向的新任務資料結構tss結構中的寄存器恢複到cpu中,系統正式開始運作新切換的任務。
為什麼會執行這句話
既然任務切換時cpu會恢複寄存器現場,那麼它當然也會儲存寄存器現場了。這些寄存器現場都會被寫入原任務的tss結構裡,值得注意的是,eip會指向引起任務切換指令ljmp的下一條指令cmpl,是以,很明顯,當原任務有朝一日再次被排程運作時,它将從eip所指的地方,而這個地方恰巧是cmpl !
比較有用的一個文章:
http://www.oldlinux.org/oldlinux/archiver/?tid-5390.html