天天看點

系統調用,上下文切換及中斷概念的彙總

       仔細揣摩了一段時間.

       系統調用過程,使用者程序進入核心态,程序棧進入核心态棧, 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頁 ),  信号的處理是在這個過程來觸發的。之前看了很多資料,都沒發現一個可以進入信号處理的入口. 幾乎所有的文章都是講怎麼發信号,怎麼處理信号.就是沒有一個說道有信号達到的程序是如何感覺到,并且被排程.

繼續閱讀