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

一、    按照https://github.com/mengning/mykernel 的说明配置mykernel 2.0,熟悉Linux内核的编译

  1. 首先下载补丁包和linux内核代码,这里补丁包已经提前下好了,由于linux内核代码比较大,所以安装一个多线程下载工具axel基于mykernel 2.0编写一个操作系统内核_第1张图片
  2. 把内核解压xz -d linux-5.4.34.tar.xz后为.tar文件、解压tar -xvf linux-5.4.34.tar后是文件夹基于mykernel 2.0编写一个操作系统内核_第2张图片

  3. 进入linux内核5.4.34,给内核打补丁,修改了前5个文件,添加了后4文件,mymain.c模拟程序入口,myinterrupt.c模拟时钟中断基于mykernel 2.0编写一个操作系统内核_第3张图片
  4. 在编译之前安装一些编译工具

    基于mykernel 2.0编写一个操作系统内核_第4张图片

 

5.安装QEMU模拟器模拟×86的环境

 

              基于mykernel 2.0编写一个操作系统内核_第5张图片

 

  6.安装一些配置和编译过程需要用到的第三方库,由于无法定位flex,故对其单独安装

       基于mykernel 2.0编写一个操作系统内核_第6张图片

 

 

     基于mykernel 2.0编写一个操作系统内核_第7张图片

 

 

  7.  配置内核

     基于mykernel 2.0编写一个操作系统内核_第8张图片

  8.编译内核

 

 

 

       基于mykernel 2.0编写一个操作系统内核_第9张图片

 

      基于mykernel 2.0编写一个操作系统内核_第10张图片

  9.运行mykernelmy_start_kernel程序执行入口,my_time_handler时钟处理程序。

    基于mykernel 2.0编写一个操作系统内核_第11张图片

 

 二、    基于mykernel 2.0编写一个操作系统内核,参照https://github.com/mengning/mykernel 提供的范例代码

  1.  首先在mykernel目录下增加一个mypcb.h头文件,用来定义进程控制块,也就是进程结构体的定义。主要有进程号、进程状态、分配存储区、保存进程的现场、进程入口等。

    基于mykernel 2.0编写一个操作系统内核_第12张图片

 

   2.  mymain,c进行修改,创建进程,0号进程是手工创建的,启动0号进程需要一些汇编代码。

    基于mykernel 2.0编写一个操作系统内核_第13张图片

 

   3.再在mymain.c中添加my_process函数,用来作为进程的代码模拟一个进程,这里采用进程运行完一个时间片主动让出CPU的方式。

    基于mykernel 2.0编写一个操作系统内核_第14张图片

 

   4.  在时钟中断处理过程中记录时间片,修改myinterrupt.cmy_timer_handler来记录时间片。

    基于mykernel 2.0编写一个操作系统内核_第15张图片

 

   5.myinterrupt.c中添加进程切换的代码my_schedule(void),调度策略就是简单的排队等待调度,next = my_current_task->next就是进程调度,调度下一个进程。进程切换是那一段汇编代码。

 

    基于mykernel 2.0编写一个操作系统内核_第16张图片

 

   6.经过以上操作,我们就完成了最精简的操作系统内核,重新编译运行内核后,效果如下图所示。

    基于mykernel 2.0编写一个操作系统内核_第17张图片

 

三、简要分析操作系统内核核心功能及运行工作机制

操作系统内核核心功能主要包括以下几个方面。

1) 时钟管理

时钟的第一功能是计时,操作系统需要通过时钟管理,向用户提供标准的系统时间。另外,通过时钟中断的管理,可以实现进程的切换。

2) 中断机制
中断机制中,只有一小部分功能属于内核,负责保护和恢复中断现场的信息,转移控制权到相关的处理程序。这样可以减少中断的处理时间,提高系统的并行处理能力。

3) 进程管理

进程状态管理、进程调度和分派、创建与撤销进程控制块等。

4) 存储器管理

存储器的空间分配和回收、内存信息保护程序、代码对换程序等。

5)设备管理

缓冲区管理、设备分配和回收等。

 

运行工作机制:操作系统的进程在执过程中,当时间⽚⽤完需要进进程切换时,需要先保存当前的进程上下环境,下次进程被调度执时,需要恢复进程上下环境。我们通过Linux内核代码模拟 了个具有时钟中断和C代码执环境的硬件平台,mymain.c中的代码在不停地执。同时有个中断处理程序的上下环境,周期性地产的时钟中断信号,能够触发myinterrupt.c中的代码,产生进程切换。

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(基于mykernel 2.0编写一个操作系统内核)