mykernel實驗指導(作業系統是如何工作的)
執行並分析乙個精簡的作業系統核心,理解作業系統是如何工作的
開啟shell
cd linuxkernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzimage
然後cd mykernel 您可以看到qemu視窗輸出的內容的**mymain.c和myinterrupt.c
1.#define kernel_stack_size 1024*28 定義乙個程序控制塊
2.ip,sp 用於儲存eip,esp
3.pcb(定義程序管理相關的資料結構) 定義了pid程序名,程序狀態,堆疊...task_entry入口 pcb*next 使用鍊錶
4.my_schedule函式---排程器
mymain.c-----------------核心初始化和0號程序啟動
2.申明了乙個pcbtask陣列,當前task的乙個指標,是否需要排程(標識)
3 **怎樣標識初始化**
(1)從my_start_kernel(void)開始,初始化當前0號程序,pid=0,狀態是正在執行,入口是my_process(實際上是my_start_kernel,只是在這初始化一下)
(2)堆疊的棧頂定義了乙個stack
(3)next指向它自己,啟動時,整個系統只有0號程序
(4)建立更多的程序for(i=1;imyinterrupt.c
1.#include "mypcb.h" , extern一些全域性的東西。time_count計數
2.設定時間片的大小,時間片用完時,設定一下排程標識。 if(timecount%1000==0&&myneedsched!=1) 當程序執行到的時候,發現needsched==1,就執行myschedule
3.myschedule() *prev---當前程序 將當前程序賦給next 情況一:如果下乙個程序的狀態是0的話,正在執行的話,用圖進行切換兩個正在執行的程序上下文切換 $1f接下來的標號1:的位置
情況二:程序從未執行過,執行起來特殊點,將狀態轉成執行時狀態,作為當前執行的程序,esp,ebp指向同一位置,
通過核心源**了解,從環境搭建起來,mystartkernerl開始初始化至完成,啟動0號程序,利用時間片,每個程序每隔1000萬次,判斷是否需要排程,排程使用myshedule()進行排程.設定時間片的大小,時間片用完時,設定一下排程標識。 if(timecount%1000==0&&myneedsched!=1) 當程序執行到的時候,發現needsched==1,就執行myschedule,排程分兩種情況,一種是下乙個程序正在進行的,另一種是從未排程過的,程序從未執行過,執行起來特殊點,將狀態轉成執行時狀態,作為當前執行的程序,esp,ebp指向同一位置兩種彙編**略有不同,是關鍵。
Linux核心分析 作業系統是如何工作的
一 計算機是如何工作的 總結 1 三個法寶 儲存程式計算機 函式呼叫堆疊 中斷機制 二 深入理解函式呼叫堆疊 1 堆疊是c語言程式執行時必須的乙個記錄呼叫路徑和引數的空間。函式呼叫框架 傳遞引數 儲存返回位址 提供區域性變數空間 2 了解堆疊存在的目的和編譯器對堆疊使用的規則是理解作業系統一些關鍵性...
linux核心分析 作業系統是如何工作的?
struct thread 這是乙個程序的結構體,其中的ip標記的是該程序的eip,而sp標記的是該程序的esp。typedef struct pcbtpcb 這是乙個程序控制塊的結構體,記錄著程序的的各種狀態與資訊。void my schedule void 該函式的功能為排程器,用於程序之間的排...
作業系統是如何啟動的
作業系統啟動過程分為bios執行和bootloader執行兩個步驟 一 bios程式執行過程 執行過程 在cpu加電之後,會把cpu所有暫存器的值設為預設值,除了cs暫存器的值改為0xffff,其他暫存器的值都為0,這樣,根據cs 和 ip的值就可以找到指令的實體地址0xffff 0x0000。這時...