基于mykernel 2.0编写一个操作系统内核
一、实验要求:
基于mykernel 2.0编写一个操作系统内核
- 按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译;
- 基于mykernel 2.0编写一个操作系统内核,参照https://github.com/mengning/mykernel 提供的范例代码
- 简要分析操作系统内核核心功能及运行工作机制
二、环境:
下载补丁:
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
成功了!