2014-02-13 29 views
-1

我正在研究一個在C中實現的簡單搶佔式內核,它將執行的主要路徑置於一個稱爲「主線程」的線程中。 線程由堆疊和含有`結構線程:爲什麼內核有一個主線程

tid_t tid;       /* Thread identifier. */ 
enum thread_status status;   /* Thread state. */ 
char name[16];      /* Name (for debugging purposes). */ 
uint8_t *stack;      /* Saved stack pointer. */ 
int priority;      /* Priority. */ 
struct list_elem allelem;   /* List element for all threads list. */ 
unsigned magic;      /* Detects stack overflow. */ 

還有一些其它部件是無關緊要的。

我不明白的部分是爲什麼主要執行路徑綁定到整個線程?據我瞭解,執行的主要途徑是CPU'unmasked'進行初始化和線程交換。其他一切都是通過CPU穿着不同的「面具」來完成的。 現在,爲什麼執行的主要路徑需要擁有一個線程的所有組件?它只需要寄存器(包含在CPU中)和堆棧(可以從軟件管理)。 那麼是不是struct thread部分是多餘的呢?它只需要一個線程的一部分:堆棧。

+0

我無法弄清楚這可能意味着什麼。 –

+0

「執行的主要路徑」是什麼意思?對我而言,這並不清楚,但我可以在結構的其他成員中看到有用的信息(即magic,溢出,名稱,調試和優先級,調度程序)。 –

+1

爲什麼要爲執行的「主要路徑」制定很多特殊情況和代碼,並且已經有了所有機制來執行此操作,並且您可以將該執行路徑視爲另一個線程。當然,主線程必須遵守大部分與其他線程相同的規則,例如被暫停以便另一個線程可以運行,等待互斥體,等等。 – nos

回答

4

猜測這裏,'因爲你的問題是有點不清楚......

你的‘執行’主要路徑就是在開機時並運行,(除其他事項外),初始化調度,內存管理器,你的操作系統的驅動程序等。通常情況下,它會希望啓動shell,登錄管理器線程,服務管理器,可加載的驅動程序等。這些實體需要內核的服務運行 - MPOE不能只調用它們。所以,在這一點上,它必須安排內核管理執行線程,同時繼續運行。因此,MPOE爲自己創建一個線程控制塊,爲它自己分配一個堆棧,初始化堆棧/ TCB看起來像一個被中斷的線程,將保存的堆棧指針指向它自己的代碼,它將運行系統的其餘部分引導和中斷 - 返回自己。它現在是一個單獨的內核管理線程,它可以加載/運行必要的驅動程序(啓用它們的硬件中斷),然後加載啓動進程(加載程序創建一個線程來初始運行進程,就像加載用戶進程一樣) ,所以你的操作系統外層與MPOE並行啓動,因爲它繼續啓動。

當所有的啓動時間操作系統進程驅動程序,服務等都運行時,MPOE可以簡單地自行終止 - 畢竟它現在只是一個線程。

總結 - MPOE必須在內核完成工作之前自行安排內核作爲線程進行管理。因此它必須具有線程控制結構,以便可以像其他任何線程一樣進行管理。

它需要的不僅僅是寄存器(它們被合併到CPU中),它必須有一個可以從內核管理的堆棧。如果沒有發生這種情況,啓動的操作系統高級組件不能與其並行運行。

注:「*。據我瞭解,執行的主要路徑是CPU‘東窗事發’做初始化和線程swaping *」 OS專家,請原諒我的經濟與可怕的複雜:)

相關問題