题目:基于mykernel 2.0编写一个操作系统内核
按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译;
简要分析操作系统内核核心功能及运行工作机制
一、实验环境配置
1.操作系统环境
腾讯云Ubuntu
2.内核环境配置
wget https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch
sudo apt install axel
axel -n 20 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.4.34.tar.xz
xz -d linux-5.4.34.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 # Default configuration is based on ‘x86_64_defconfig‘
make -j$(nproc)
sudo apt install qemu # install QEMU
qemu-system-x86_64 -kernel arch/x86/boot/bzImage
运行结果如下:
二.内核编写
1.添加PCB结构体
#define MAX_TASK_NUM 4
#define KERNEL_STACK_SIZE 1024*2
/* CPU-specific state of this task */
struct Thread {
unsigned long ip;
unsigned long sp;
};
typedef struct PCB{
int pid;
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
unsigned long stack[KERNEL_STACK_SIZE];
/* CPU-specific state of this task */
struct Thread thread;
unsigned long task_entry;
struct PCB *next;
}tPCB;
void my_schedule(void);
Thread结构体中,ip和sp变量用来在进程切换时,保存或者恢复当前指令指针寄存器和栈指针寄存器的值。也就是需要用这个结构来保存部分的上下文信息。
PCB结构体中,pid是进程的id进程号,state表示进程状态,-1、0、1分别表示阻塞、就绪、终止三种状态,stack数组用来模拟进程的栈。task_entry是进程的运行入口,
而从next指针可以看到,进程PCB之间用链表结构连接。
2.修改mymain.c