基於 mykernel 實現具有程序切換的基本核心

2021-09-12 10:31:15 字數 3308 閱讀 1167

由sa***411創作

ubuntu 18.04 預設的gcc編譯器的版本是 gcc-7, gcc-5 之後的版本由於調整了一小部分標頭檔案的命名方式,無法直接編譯 linux 3.9.4 核心,因此我使用 gcc-4.8 進行編譯。

位址

mkdir mykernel

cd mykernel

wget

wget

tar xzvf linux-3.9.4.tar.gz

cd linux-3.9.4

patch -p1 <

../mykernel_for_linux3.9.4sc.patch

make allnoconfig

make

qemu-system-i386 -kernel arch/x86/boot/bzimage

實驗過程截圖如下

我參考了孟寧老師提供的**,實現了簡單的基於時間片輪轉的程序切換,效果如下圖所示。

// 最大程序數量

#define max_task_num 4

// 核心棧容量

#define kernel_stack_size 1024*2 # unsigned long

/* cpu-specific state of this task */

// 程序的關鍵指標

struct thread

;// pcb結構體

typedef

struct pcbtpcb;

//排程函式

void

my_schedule

(void

);

/*

*/// pcb 陣列,集中儲存所有程序的 pcb

tpcb task[max_task_num]

;// pcb 指標,指向當前執行的程序

tpcb * my_current_task =

null

;// 全域性排程指示變數,其實是中斷標誌

volatile

int my_need_sched =0;

// 中斷處理函式

void

my_process

(void);

// 初始化函式

void __init my_start_kernel

(void)/

* start process 0 by task[0]

*/pid =0;

my_current_task =

&task[pid]

;asm

volatile

("movl %1,%%esp\n\t"

/* set task[pid].thread.sp to esp */

"pushl %1\n\t"

/* push ebp */

"pushl %0\n\t"

/* push task[pid].thread.ip */

"ret\n\t"

/* pop task[pid].thread.ip to eip */::

"c"(task[pid]

.thread.ip)

,"d"

(task[pid]

.thread.sp)

/* input c or d mean %ecx/%edx*/);

}int i =0;

// 排程函式

void

my_process

(void

)printk

(kern_notice "this is process %d +\n"

,my_current_task->pid);}

}}

extern tpcb task[max_task_num]

;extern tpcb * my_current_task;

extern

volatile

int my_need_sched;

volatile

int time_count =0;

/* * called by timer interrupt.

* it runs in the name of current running process,

* so it use kernel stack of current running process

*/// 定時中斷函式

void

my_timer_handler

(void)

time_count ++

;#endif

return;}

// 排程函式

void

my_schedule

(void

)printk

(kern_notice ">>>my_schedule<<

/* schedule */

next = my_current_task->next;

prev = my_current_task;

if(next->state ==0)

/* -1 unrunnable, 0 runnable, >0 stopped */

return

;}

基於mykernel 2 0編寫乙個作業系統核心

一 實驗準備 在實驗開始之前,需要虛擬化乙個x86 64的cpu硬體平台 使用實驗事先準備的虛擬cpu平台,在ubuntu18.04lts作業系統上依次執行以下命令列 wget sudo apt install axel axel n 20 xz d linux 5.4.34.tar.xz tar ...

基於mykernel 2 0編寫乙個作業系統核心

一 配置mykernel 2.0 實驗環境 vmware 虛擬機器ubuntu 18.04.1 lts amd64 配置命令 tar.xz 解壓 tar xvf linux 5.4.34 tar cd linux 5.4.34 patch p1 mykernel 2.0 for linux 5.4....

Jquery NProgress實現網頁進度條顯示

前端開發中,進度條庫是常見的庫之一,bootstrap中提供了多種進度條樣式,其中nprogress.js是一款輕量級的進度條元件,使用簡便。nprogress可實現的進度條效果,如下圖所示。使用方法 1 引入nprogress.js和nprogress.css到專案中 2 呼叫start 和 do...