本次課的核心是通過中斷機制完成程序的排程 ,在本次課程中__init my_start_kernel作為入口函式,定義0號程序的tpcb結構體,通過複製來製造其他程序的tpcb資料結構,中斷時間函式被 my_timer_handler週期性的呼叫來修改my_need_sched 的值,而0號程序一直在檢測my_need_sched 的狀態,當狀態改變的時候呼叫my_schedule()函式來進行程序的切換,在程序切換的過程中,採用的是彙編**。下面分析一下**:
1、mypcb.h
struct thread
unsigned long ip; //
unsigned long sp; //在當前程序中,esp指向的位址
typedef struct pcb
int pid;
volatile long state; /-1 unrunnable ,0 runnable,>0 stopped*/
char stack[kernel_stack_size];
struct thread thread;
unsigned long task_entry;
struct pcb*next;
}tpcb;
void my_schedule(void);// 排程器
在這個標頭檔案中定義了乙個 thread結構和tpcb結構體,thread結構體的作用是儲存相應的程序的esp和eip的位址。它的作用是儲存當前程序的esp和eip,當當前程序執行的時候將載入到相應的esp和eip中,當切換出去的時候,就會把esp和eip中的值儲存到這個結構體中。tpcb的作用是儲存相應程序的資訊。
2、mymain.c
void __init my_start_kernel(void)
//end of my_schedule
在程序切換函式中,分兩種情況通過要切換到的程序的狀態來判斷,根據程序是否已經執行過,如果執行過,直接儲存上乙個程序的ebp,esp和eip,載入下乙個程序的eip和esp。如果沒有執行過,還要將esp和ebp載入sp的位址。
4、計算機的三個法寶
儲存程式計算機
函式呼叫堆疊
中斷5、作業系統兩把寶劍
中斷處理
程序切換
下圖是執行的結果:
Linux核心分析第二週總結
32位x86通過函式呼叫堆疊來傳遞引數 使用eax儲存返回位址 堆疊暫存器和堆疊操作 ebp僅記錄當前函式的呼叫基址 堆疊相關暫存器 其他關鍵暫存器 函式呼叫時堆疊的變化 生成反彙編檔案 mykernel實驗模擬計算機硬體平台 程序是動態執行的實體,核心是程序的管理者。程序不但包括程式的指令和資料,...
Linux核心分析 實驗二
該實驗要求完成乙個簡單的時間片輪轉多道程式核心 首先我們看看mykernel裡面的mypcb.h define max task num 10 max num of task in system define kernel stack size 1024 8struct thread typedef...
第二週實驗
第二週實驗 a 化學 通過輸入原子之間的化學鍵來區別五種不一樣的烷烴基 思路 觀察五種烷烴基,發現他們之間的區別,利用到圖中各點的度數來進行區分 n hexane 中最大度數為2,這可以將它與其他區分開來 2 methylpentane中最大度數為3,只有乙個點 3 methylpentane 中最...