由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...