仔細揣摩了一段時間.
系統調用過程,使用者程序進入核心态,程序棧進入核心态棧, cpu進入核心态,cpu使用者态各寄存器的值儲存到核心态棧,執行核心态代碼. 執行完從核心态傳回到使用者态,包括程序棧傳回到使用者态棧,cpu傳回到使用者态,cpu各寄存器的值用之前儲存在核心态棧的值還原. 核心在執行系統調用時處于程序上下文中,current指針指向目前程序,即引發系統調用的程序。
1 系統調用的過程中 可以發生程序切換(1 來自時鐘中斷,時間片用完,schedule()。2核心态代碼執行過程中阻塞,主動schedule() )。
2 系統調用的過程中 可以發生中斷,中斷任意時刻可以發生,中斷不屬于任何一個程序上下文.
a 目前程序是使用者态 cpu進入核心态,使用棧進入到中斷棧,并且在中斷棧儲存使用者态各寄存器的值,執行中斷代碼,中斷代碼執行過程中 不能被阻塞, 不能被切換。執行完中斷代碼後,從中斷棧恢複使用者态寄存器值,cpu進入使用者态。(使用者态進入到核心棧時,該棧時空的,中斷代碼可以直接使用程序的核心态棧)
b 目前程序是核心态,使用棧進入到中斷棧,并且在中斷棧儲存核心态各寄存器的值,執行中斷代碼,執行完中斷代碼後,從中斷棧恢複核心态寄存器值.
c 中斷代碼執行時,處在中斷上下文.不屬于任何一個程序上下文.
d 每CPU變量中會有兩個棧單獨用于中斷過程 分别用于軟中斷和硬中斷 (2.6.x版本後)
3 從核心态傳回到使用者态的過程中,有很多事情都是這個環節裡面做的.
a .檢查 need_resched,目前程序是否需要發起schedule() ,這個過程也會發生程序切換
b 會檢查所有程序是否有信号到達(深入了解linux核心 第三版 422頁 ), 信号的處理是在這個過程來觸發的。之前看了很多資料,都沒發現一個可以進入信号處理的入口. 幾乎所有的文章都是講怎麼發信号,怎麼處理信号.就是沒有一個說道有信号達到的程序是如何感覺到,并且被排程.