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

2022-08-13 01:33:14 字數 2991 閱讀 2445

一 、配置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

/*

* 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);

2對mymain.c中的my_start_kernel函式進行修改,並在mymain.c中實現了my_process函式,用來作為程序的**模擬乙個個程序,時間片輪轉排程。

#include "mypcb.h"

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);}}

}

3對myinterrupt.c的修改,my_timer_handler用來記錄時間片,時間片消耗完之後完成排程。並在該檔案中完成,my_schedule(void)函式的實現

#include "mypcb.h"

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;

}

4 重新編譯(linux 目錄下make命令),再次執行,檢視執行結果,可以看見程序的切換

三、執行流程分析

系統啟動後,首先執行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的開源人臉識別庫...