基于mykernel 2.0编写一个操作系统内核

一、实验要求:

基于mykernel 2.0编写一个操作系统内核

  1. 按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译;
  2. 基于mykernel 2.0编写一个操作系统内核,参照https://github.com/mengning/mykernel 提供的范例代码
  3. 简要分析操作系统内核核心功能及运行工作机制

二、环境:

下载补丁:
wget https://raw.github.com/mengning/mykernel/master/mykernel-2.0_for_linux-5.4.34.patch
安装axel:

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

编译(超长时间):

 

 安装qemu:

sudo apt install qemu

 

二、实验过程:

查看当前的kernel运行状态:
qemu-system-x86_64 -kernel arch/x86/boot/bzImage

从qemu窗口中您可以看到my_start_kernel在执行,同时my_timer_handler时钟中断处理程序可以执行。

  

进入mykernel目录可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c:

 

  

执行编译:
make clean
make allnoconfig          
make

 

  

修改:
mymain.c

 myinterrupt.c


解析一下进程切换的代码:

1,2 保存的是前一个进程的ebp和esp,ebp保存在栈中,esp保存在pcb.sp中

3 更换了进程栈,原本esp指向前一个进程的栈,而后指向了后一个进程的栈

4 将$1f 保存到了前一个线程的pcb.ip中(可以看做是保存当前进程的ip)

5,6 修改当前eip寄存器的值,相当于原来rip的内容为前一个进程的指令地址,现在为后一个进程的指令地址

7,8 将ebp寄存器的值修改为下一个进程的栈底

再编译:
make clean
make allnoconfig 
make
qemu-system-x86_64 -kernel arch/x86/boot/bzImage

  

成功了!

 

posted @ 2020-05-12 12:20  GoodbyeLullaby  阅读(128)  评论(0编辑  收藏  举报