基于mykernel多进程的简单内核代码分析

本文介绍了mykernel,一个简单的计算机硬件模拟环境,用于理解多进程内核的实现。主要内容包括mykernel的部署、内核代码分析,特别是myinterrupt.c、mymain.c和mypcb.h三个关键文件的功能,以及my_timer_handler和my_schedule函数在进程调度中的作用。通过mykernel,读者可以深入理解操作系统中进程切换和中断处理的概念。
摘要由CSDN通过智能技术生成

学号后三位:069

原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/

始臣之解牛之时,所见无非全牛者。

三年之后,未尝见全牛也。

0、mykernel简介

mykernel是孟宁老师在2013年,在Linux内核繁杂的CPU初始化工作的基础上完成的一个虚拟、可编程的计算机硬件模拟环境。有了mykernel,稍有编程能力的学生就可以编写一个简单的时间片轮转调度的小型内核,并且能读懂代码,深刻理解如何在CPU的一个指令执行流上实现多个进程。

1、mykernel部署

使用实验楼的虚拟机打开shell
依次输入如下指令:

cd LinuxKernel/linux-3.9.4
rm -rf mykernel
patch -p1 < ../mykernel_for_linux3.9.4sc.patch  
make allnoconfig
make  //编译时间大概10分钟
qemu -kernel arch/x86/boot/bzImage

部署过程截图

经过耐心的等待后,看到编译完成了。⬇️
编译完成截图

在输入qemu -kernel arch/x86/boot/bzImage指令后,跳出如下界面。且有两类字符串不断交替输出。
在这里插入图片描述

实际上,

  • my_timer_handler here字符串是由myinterrupt.cmy_timer_handler函数控制输出的
  • my_start_kernel here字符串是由mymain.cmy_start_kernel函数控制输出的

可见如下截图:
在这里插入图片描述

在这里插入图片描述

由此,我们可以知道,在系统启动后会周期性的调用myinterrupt.c中my_timer_handler函数以及mymain.c中my_start_kernel函数

2、内核代码分析

本部分是要完成一个简单的时间片轮转多道程序内核代码,源代码来自孟宁老师的GitHub。https://github.com/mengning/mykernel

主要包含三部分文件:
在这里插入图片描述

  • myinterrupt.c
    包含模拟中断的函数。
  • mymain.c
    包含模拟多个运行的进程的函数。
  • mypcb.h
    头文件,定义了一些结构体等内容。

将以上文件下载到实验楼虚拟机中。

git clone https://github.com/mengning/mykernel

在这里插入图片描述

将这三个文件拷贝到LinuxKernel/linux-3.9.4下的mykernel中,覆盖原文件并增加新文件:mypcb.h
在这里插入图片描述

拷贝后

在LinuxKernel/linux-3.9.4下,执行下面指令:

patch -p1 < ../mykernel_for_linux3.9.4sc.patch //一定要打补丁
make allnoconfig //第二次编译之前,一定要make clean,不然会出错
make  

编译结果

输入如下指令后:

qemu -kernel arch/x86/boot/bzImage

弹出窗口,显示进程的运行及切换过程:
在这里插入图片描述
在上图中可以看到,进程切换的过程。⬆️

下面具体分析下这三个文件的代码:

  • mypcb.h

源代码:https://github.com/mengning/mykernel/blob/master/mypcb.h

宏定义:
#define MAX_TASK_NUM 4 定义了最大任务数
#define KERNEL_STACK_SIZE 1024*2定义了堆栈内核大小

线程结构体:
struct Thread {
unsigned long ip;ip指令指针
unsigned long sp;sp堆栈指针
};

此文件中最关键的部分是,下面的PCB结构体:

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;

其中,
pid表示进程号,是进程的标识符
state表示进程的状态,-1表示不可运行;0表示可运行等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值