一 、配置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.34
.patch
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev
make defconfig
10 make -j$(nproc)
sudo apt install qemu
12 qemu-system-x86_64 -kernel arch/x86/boot/bzimage
配置成功後結果如下,從qemu視窗中可以看到my_start_kernel在執行:
二、基於mykernel 2.0編寫乙個作業系統核心並進行分析
1 首先在mykernel目錄下增加乙個mypcb.h 標頭檔案,用來定義程序控制塊(process control block),也就是程序結構體的定義。
結構體thread 結構體,用於儲存當前程序中正在執行的執行緒的ip和sp
/*2對mymain.c中的my_start_kernel函式進行修改,並在mymain.c中實現了my_process函式,用來作為程序的**模擬乙個個程序,時間片輪轉排程。* linux/mykernel/mypcb.h
*///最大的任務數
#define max_task_num 4
#define kernel_stack_size 1024*8
/* cpu-specific state of this task */
struct thread ;
typedef struct pcbtpcb;
//排程函式
void my_schedule(void);
#include "mypcb.h"3對myinterrupt.c的修改,my_timer_handler用來記錄時間片,時間片消耗完之後完成排程。並在該檔案中完成,my_schedule(void)函式的實現tpcb task[max_task_num];
tpcb * my_current_task = null;
volatile int my_need_sched = 0;
void my_process(void);
void __init my_start_kernel(void)
printk(kern_notice "this is process %d +\n",my_current_task->pid);}}
}
#include "mypcb.h"4 重新編譯(linux 目錄下make命令),再次執行,檢視執行結果,可以看見程序的切換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.
*/void my_timer_handler(void)
time_count ++ ;
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;
}
![](https://pic.w3help.cc/539/cb2265c47d5b22fcc2f8d14d9473f.jpeg)
三、執行流程分析
系統啟動後,首先執行mymain.c中的my_start_kernel函式,裡面是乙個while(1) 迴圈,永遠執行下去。然後是myinterrupt.c,裡面的my_timer_handler 函式會被核心週期性的呼叫,每呼叫1000次,就去將全域性變數my_need_sched的值修改為1,my_start_kernel中的while迴圈發現my_need_sched值變為1後,就進行程序的排程,完成程序的切換,如此往復。
基於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 ...
基於全志20平板方案(一)
全志雙核a20是2013年3月推出的一款移動應用處理器,主要針對平板電腦及智慧型電視領域。初識全志a20,只因筆者一時熱 nao 心 chou 關注了一下當前火熱的開源硬體,忍痛在某寶的官方途徑購買了一塊cubietruck開發板。如下圖 筆者坐等收貨的那幾天,一直yy著自己單手托起一塊紅色心臟,接...
基於PYQT編寫乙個人臉識別軟體
9月份時,大四狗都忙著 保研大戰 在等待結果的那幾天,我就自己寫了乙個人臉識別的小軟體 打發時間 軟體基於python語言編寫,用了pyqt還有face recognition庫。有關face recognition庫的應用,我在之前的部落格中介紹了如何使用。應用乙個基於python的開源人臉識別庫...