2017-08-15 28 views
0

考慮到Linux情況,我們知道每個用戶堆棧都有一個內核堆棧,無論何時發生上下文切換,我們切換到當前的內核模式處理。調度 - 每個進程有一個或多個內核堆棧的上下文切換

這裏我們保存當前進程的當前狀態,寄存器,程序數據等,然後調度程序(不知道它是否在此內核中運行)保存PCB並加載下一個要調度的進程的PCB。

現在第一個問題是,如果上面的解釋似乎對您有意義,考慮一個上下文切換,其中每個進程都有一個「專用」內核堆棧。

而我的問題的另一部分是,如果我們有一個單一的內核堆棧的所有進程會發生上下文切換?

回答

0

每個進程都有自己的內核堆棧。

我將以最新的內核爲例。

include/linux/sched.h,有一個名爲thread_union聯盟及其定義如下:

union thread_union { 
#ifndef CONFIG_THREAD_INFO_IN_TASK 
    struct thread_info thread_info; 
#endif 
    unsigned long stack[THREAD_SIZE/sizeof(long)]; 
}; 

當創建一個新的進程,內核將分配一個thread_union它和每個進程都有其「敬業「thread_union

  1. 第一構件thread_info是含有一個指針,指向這一進程的task_struct一個結構。
  2. 第二個成員stack是此進程的內核堆棧。
  3. 這是一個聯合,所以這兩個成員使用相同的內存空間。 thread_info不是很大,所以內核堆棧有足夠的空間。

當一個進程調用系統調用時,它將使用自己的內核堆棧並保存指向內核堆棧中用戶堆棧的%ESP

每個進程都有自己的thread_union,所以他們擁有自己的「專用」內核堆棧。

+0

所以這個答案是關於我的問題的第一部分嗎?因爲從這裏我還不能很好地理解在所有進程(與其各自的用戶堆棧)基於單個(UNIQUE)內核堆棧的情況下,上下文切換將如何工作 – DevX10

+0

@ DevX10每個進程都有自己的'thread_union',所以他們有自己的「專用」內核堆棧,它是'thread_union'的成員。內核堆棧的指針是保存在TSS中的'ss0:esp0'。當上下文切換髮生時,TSS將被改變,所以內核堆棧也將被切換。 – haolee

+0

是的,但問題是如何在另一種情況下工作?我不是在談論linux(我的例子是展示這種系統,我們爲每個進程都有一個「專用」內核堆棧,但也有一些系統,我們只有一個內核堆棧)。 而問題是如何這樣的工作?我們將在何處保存寄存器,程序數據,切換時每個進程的用戶堆棧指針? – DevX10

相關問題