一、 按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译
- 首先下载补丁包和linux内核代码,这里补丁包已经提前下好了,由于linux内核代码比较大,所以安装一个多线程下载工具axel
-
把内核解压xz -d linux-5.4.34.tar.xz后为.tar文件、解压tar -xvf linux-5.4.34.tar后是文件夹
- 进入linux内核5.4.34,给内核打补丁,修改了前5个文件,添加了后4文件,mymain.c模拟程序入口,myinterrupt.c模拟时钟中断
- 在编译之前安装一些编译工具
5.安装QEMU模拟器模拟×86的环境
6.安装一些配置和编译过程需要用到的第三方库,由于无法定位flex,故对其单独安装
7. 配置内核
8.编译内核
9.运行mykernel,my_start_kernel程序执行入口,my_time_handler时钟处理程序。
二、 基于mykernel 2.0编写一个操作系统内核,参照https://github.com/mengning/mykernel 提供的范例代码
1. 首先在mykernel目录下增加一个mypcb.h头文件,用来定义进程控制块,也就是进程结构体的定义。主要有进程号、进程状态、分配存储区、保存进程的现场、进程入口等。
2. 对mymain,c进行修改,创建进程,0号进程是手工创建的,启动0号进程需要一些汇编代码。
3.再在mymain.c中添加my_process函数,用来作为进程的代码模拟一个进程,这里采用进程运行完一个时间片主动让出CPU的方式。
4. 在时钟中断处理过程中记录时间片,修改myinterrupt.c的my_timer_handler来记录时间片。
5.在myinterrupt.c中添加进程切换的代码my_schedule(void),调度策略就是简单的排队等待调度,next = my_current_task->next就是进程调度,调度下一个进程。进程切换是那一段汇编代码。
6.经过以上操作,我们就完成了最精简的操作系统内核,重新编译运行内核后,效果如下图所示。
三、简要分析操作系统内核核心功能及运行工作机制
操作系统内核核心功能主要包括以下几个方面。
1) 时钟管理
时钟的第一功能是计时,操作系统需要通过时钟管理,向用户提供标准的系统时间。另外,通过时钟中断的管理,可以实现进程的切换。
2) 中断机制
中断机制中,只有一小部分功能属于内核,负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力。
3) 进程管理
进程状态管理、进程调度和分派、创建与撤销进程控制块等。
4) 存储器管理
存储器的空间分配和回收、内存信息保护程序、代码对换程序等。
5)设备管理
缓冲区管理、设备分配和回收等。
运行工作机制:操作系统的进程在执⾏过程中,当时间⽚⽤完需要进⾏进程切换时,需要先保存当前的进程上下⽂环境,下次进程被调度执⾏时,需要恢复进程上下⽂环境。我们通过Linux内核代码模拟 了⼀个具有时钟中断和C代码执⾏环境的硬件平台,mymain.c中的代码在不停地执⾏。同时有⼀个中断处理程序的上下⽂环境,周期性地产⽣的时钟中断信号,能够触发myinterrupt.c中的代码,产生进程切换。