Linux核心分析 實驗二

2021-07-10 07:43:02 字數 1296 閱讀 8376

該實驗要求完成乙個簡單的時間片輪轉多道程式核心**。

首先我們看看mykernel裡面的mypcb.h:

#define max_task_num  10  // max num of task in system #define kernel_stack_size  1024*8
struct thread 

;typedef struct pcbtpcb;

該檔案在最開始定義了最大的任務數量max_task_num和核心棧大小kernen_stack_size;然後定義了乙個結構體,用來儲存指令指標ip和棧頂指標sp;然後結構體pcb裡面定義了程序號pid,程序狀態state等屬性從而完成了對程序的基本描述。

進入kernel目錄的mymain.c,我們會看到如下**:

void __init my_start_kernel(void)

該函式首先將任務初始化為0,狀態置為0表示可執行;設定執行的程序號以及棧頂sp,然後設定下乙個程序指向自己;將剩下的任務隨機分配優先許可權。嵌入的一段彙編**首先將sp賦值給esp,然後將sp進棧,再把ip進棧;最後return和ebp出棧,這樣就完成了乙個程序的啟動。

void __init my_start_kernel(void)

}

該函式是作業系統的啟動函式,我們可以看到,每迴圈執行100000次,列印出「my_start_kernel here".。

在myinterrupt.c裡面,我們可以看到下面這個函式:

void my_schedule(void)  printk(kern_notice ">>>my_schedule0 stopped */  else  return; }
在myshedule函式中如果下乙個程序可執行,則ebp壓棧,將esp儲存到上乙個程序的sp中,下條程序的sp儲存到esp,然後儲存eip上乙個也就是儲存程序的上下文,然後開啟下乙個程序;若下乙個程序不可執行,先要將其標記為可執行,然後再進行程序的上下文切換,這裡與上面有一點不同的地方是此程序沒有執行過,棧是空的,棧頂指標和棧基指標相同,所以是把 thread 中的 sp 賦給 ebp。

執行截圖:

《linux 核心分析》 第二週 實驗

本次課的核心是通過中斷機制完成程序的排程 在本次課程中 init my start kernel作為入口函式,定義0號程序的tpcb結構體,通過複製來製造其他程序的tpcb資料結構,中斷時間函式被 my timer handler週期性的呼叫來修改my need sched 的值,而0號程序一直在檢...

Linux核心分析實驗三

使用gdb 跟蹤除錯核心從 start kernel 到init 程序啟動 使用gdb 跟蹤除錯核心 開啟 shell 終端,執行以下命令 cdlinuxkernel qemu kernellinux 3.18.6 arch x86 boot bzimage initrd rootfs.img s ...

Linux核心分析 實驗四

當我們使用某些庫函式的api時,實際上該庫函式啥都沒乾,它只是乙個系統呼叫的封裝。x86為例,系統呼叫會執行int 0x80指令,也就是陷入。作業系統會變為核心態,查詢系統呼叫表,跳轉到相應的系統呼叫。每個系統呼叫都對應乙個唯一的系統呼叫號,系統呼叫之前,會從eax暫存器讀系統呼叫號,系統呼叫的返回...