// 程序控制結構體(pcb) --> 用來管理程序
struct tack_struct ;
struct mm_struct ;
// 用於保留現場
struct thread_struct ;
/* * 在linux核心中, 將task_truct結構體和程序的核心層棧空間融為一體, 低位址存放task_struct結構體, 餘下的存放程序的核心層棧空間使用
* */
// 通過該聯合體建立出來的是linux下第乙個程序, 注意: 這個程序不是我們提到的init程序, init程序是linux第二個程序
union task_union ;
#define init_task(tsk) \
// 1, 2, 3都是初始化第乙個程序
// 1
union task_union init_task_union __attribute__((__section__(".data.init_task"))) = ;
// 2
struct task_struct *init_task[np_cpus] = ;
struct mm_struct init_mm = ;
// 3
struct thread_struct init_thread = ;
struct tss_struct __attirbute__((packed));
#define init_tss \
struct tss_struct init_tss[nr_cpus] = ;
/*
* 在之前我們恢復異常和中斷的現場的時候就發現要對大量的暫存器中的資料壓棧儲存, 有在task_struct的thread在程序切換的時候儲存資料的方式的啟發, 我們可以定義乙個結構體來儲存保留
* 現場的暫存器的資料, 然後直接將這個結構體中的資料直接拷貝到核心棧中, 而不是乙個乙個地壓入到核心棧中, 這樣效率高
*//*
* 這個程序的現場保留的資料就交給了這個pt_regs結構體了, 他和異常以及中斷時將大部分暫存器中的資料壓棧是一樣的
*//*
* 我們知道乙個作業系統會管理很多個程序, 我們需要有乙個函式來獲取當前的task_struct
*/inline struct task_struct *get_current()
#define current get_current()
#define get_current \
"movq %rsp, %rbx \n\t" \
"andq $ - 32768, %rbx \n\t"
呼叫了kernel_thread函式之後, 我們只是完成了乙個子程序的建立, 現在我們要去執行該程序了
使用switch_to函式進行程序切換即可
posted @
2018-10-19 08:37
jin_hao_chen 閱讀(
...)
編輯收藏
作業系統中程序概念的理解
作業系統中程序概念的理解 提 起程序這個概念,讓很多經常使用計算機的人感到陌生,其實我們經常和它打交道,只要在計算機上執行乙個程式,相應的乙個程序就誕生了,而且它伴隨著整個操 作過程,直到程式終止。程序在作業系統中是乙個非常抽象 非常重要 非常難以理解的概念。對程序概念的深入透徹的理解,有助於理解作...
作業系統核心原理 3 程序原理(中) 程序排程
ps 在多程序併發的環境裡,雖然從概念上看,有多個程序在同時執行,但在單個cpu下,在任何時刻只能有乙個程序處於執行狀態,而其他程序則處於非執行狀態。那麼問題來了,我們是如何確定在任意時刻到底由哪個程序執行,哪些不執行呢?這就涉及到程序管理的乙個重要組成部分 程序排程,跟隨本篇來一起複習下程序排程吧...
作業系統中程序的五種基本狀態及其轉換
建立狀態 new 程序在建立時需要申請乙個空白pcb,向其中填寫控制和管理程序的資訊,完成資源分配。如果建立工作無法完成,比如資源無法滿足,就無法被排程執行,把此時程序所處狀態稱為建立狀態 就緒狀態 ready 程序已經準備好,已分配到所需資源,只要分配到cpu就能夠立即執行 執行狀態 runnin...