2023-2024-1 20232826《Linux内核原理与分析》第三周作业

20232826王朝昆 2023-10-06 16:49:30

操作系统是如何工作的

 

一、ChatGPT提问相关知识与回答:

                  

                  

 

                  

 

二、本次实验内容

(1)使用实验楼的实验环境打开shell

                 

patch -p1 < ../mykernel_for_linux3.9.4sc.patch 是一个用于应用补丁(patch)到Linux内核源代码的命令。

1  patch:这是一个命令行工具,用于将补丁文件应用到源代码文件中,从而修改源代码以包含补丁中的更改。

2  -p1:这是`patch`命令的一个选项,用于指定应用补丁时要去掉的路径前缀数量。在这种情况下,`-p1`表示去掉一个路径前缀。这是因为补丁文件通常包含了相对于源代码根目录的路径信息,通过指定`-p1`选项,`patch`命令会忽略掉一个路径前缀,以确保正确应用补丁。

3  <:这是一个重定向操作符,用于将补丁文件的内容输入到`patch`命令,而不是从命令行参数中提供。

4  ../mykernel_for_linux3.9.4sc.patch:这是要应用的补丁文件的路径和文件名。`..` 表示上一级目录,`mykernel_for_linux3.9.4sc.patch` 是补丁文件的名称。该文件包含了一组更改,以便将它们应用到Linux内核的源代码中。

综合起来,这个命令告诉`patch`命令在Linux内核的源代码上应用指定的补丁文件,并且通过`-p1`选项去掉一个路径前缀以确保补丁中的路径信息正确匹配源代码目录结构。这通常用于在自定义内核上应用补丁,以添加或修改内核的功能或修复bug。

(2)make重新编译:

                 

 (3)make编译后,qemu启动并加载一个指定的内核镜像文件

qemu -kernel arch/x86/boot/bzImage

                  

qemu -kernel arch/x86/boot/bzImage是一个使用QEMU虚拟机的命令,它指示QEMU启动并加载一个指定的内核镜像文件(通常是Linux内核)。

1. `qemu`:这是QEMU虚拟机的启动命令。QEMU是一个开源的虚拟机监控器和模拟器,它允许你在一个虚拟化的环境中运行操作系统和应用程序,而不必依赖于物理硬件。

2. `-kernel`:这是QEMU的命令行选项,用于指定要加载的内核镜像文件。在这种情况下,它告诉QEMU要加载的内核镜像文件是 `arch/x86/boot/bzImage`。

3. `arch/x86/boot/bzImage`:这是Linux内核的二进制镜像文件的路径和名称。这个文件通常是编译后的Linux内核二进制文件,可以用于启动一个虚拟机或物理计算机。

通过执行这个命令,QEMU将加载指定的Linux内核镜像文件,并尝试在虚拟机中运行它。这对于开发和测试操作系统内核或运行不同的内核版本非常有用。请注意,你可能需要其他QEMU选项和参数,以便配置虚拟机的其他方面,如内存、CPU、设备等。

(4)完成一个简单的时间片轮转多道程序内核代码

代码来源: GitHub - mengning/mykernel: mykernel 2.0: Develop your own OS kernel by reusing Linux infrastructure, based on x86-64/Linux Kernel 5.4.34.

mymain.c:

/*
 *  linux/mykernel/mymain.c
 *
 *  Kernel internal my_start_kernel
 *  Change IA32 to x86-64 arch, 2020/4/26
 *
 *  Copyright (C) 2013, 2020  Mengning
 *  
 */
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/tty.h>
#include <linux/vmalloc.h>


#include "mypcb.h"

tPCB task[MAX_TASK_NUM];
tPCB * my_current_task = NULL;
volatile int my_need_sched = 0;

void my_process(void);


void __init my_start_kernel(void)
{
    int pid = 0;
    int i;
    /* Initialize process 0*/
    task[pid].pid = pid;
    task[pid].state = 0;/* -1 unrunnable, 0 runnable, >0 stopped */
    task[pid].task_entry = task[pid].thread.ip = (unsigned long)my_process;
    task[pid].thread.sp = (unsigned long)&task[pid].stack[KERNEL_STACK_SIZE-1];
    task[pid].next = &task[pid];
    /*fork more process */
    for(i=1;i<MAX_TASK_NUM;i++)
    {
        memcpy(&task[i],&task[0],sizeof(tPCB));
        task[i].pid = i;
	    task[i].thread.sp = (unsigned long)(&task[i].stack[KERNEL_STACK_SIZE-1]);
        task[i].next = task[i-1].next;
        task[i-1].next = &task[i];
    }
    /* start process 0 by task[0] */
    pid = 0;
    my_current_task = &task[pid];
	asm volatile(
    	"movq %1,%%rsp\n\t" 	/* set task[pid].thread.sp to rsp */
    	"pushq %1\n\t" 	        /* push rbp */
    	"pushq %0\n\t" 	        /* push task[pid].thread.ip */
    	"ret\n\t" 	            /* pop task[pid].thread.ip to rip */
    	: 
    	: "c" (task[pid].thread.ip),"d" (task[pid].thread.sp)	/* input c or d mean %ecx/%edx*/
	);
} 

int i = 0;

void my_process(void)
{    
    while(1)
    {
        i++;
        if(i%10000000 == 0)
        {
            printk(KERN_NOTICE "this is process %d -\n",my_current_task->pid);
            if(my_need_sched == 1)
            {
                my_need_sched = 0;
        	    my_schedule();
        	}
        	printk(KERN_NOTICE "this is process %d +\n",my_current_task->pid);
        }     
    }
}

 myinterrupt.c:

/*
 *  linux/mykernel/myinterrupt.c
 *
 *  Kernel internal my_timer_handler
 *  Change IA32 to x86-64 arch, 2020/4/26
 *
 *  Copyright (C) 2013, 2020  Mengning
 *
 */
#include <linux/types.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/tty.h>
#include <linux/vmalloc.h>

#include "mypcb.h"

extern tPCB task[MAX_TASK_NUM];
extern tPCB * my_current_task;
extern volatile int my_need_sched;
volatile int time_count = 0;

/*
 * Called by timer interrupt.
 * it runs in the name of current running process,
 * so it use kernel stack of current running process
 */
void my_timer_handler(void)
{
    if(time_count%1000 == 0 && my_need_sched != 1)
    {
        printk(KERN_NOTICE ">>>my_timer_handler here<<<\n");
        my_need_sched = 1;
    } 
    time_count ++ ;  
    return;  	
}

void my_schedule(void)
{
    tPCB * next;
    tPCB * prev;

    if(my_current_task == NULL 
        || my_current_task->next == NULL)
    {
    	return;
    }
    printk(KERN_NOTICE ">>>my_schedule<<<\n");
    /* schedule */
    next = my_current_task->next;
    prev = my_current_task;
    if(next->state == 0)/* -1 unrunnable, 0 runnable, >0 stopped */
    {        
    	my_current_task = next; 
    	printk(KERN_NOTICE ">>>switch %d to %d<<<\n",prev->pid,next->pid);  
    	/* switch to next process */
    	asm volatile(	
        	"pushq %%rbp\n\t" 	    /* save rbp of prev */
        	"movq %%rsp,%0\n\t" 	/* save rsp of prev */
        	"movq %2,%%rsp\n\t"     /* restore  rsp of next */
        	"movq $1f,%1\n\t"       /* save rip of prev */	
        	"pushq %3\n\t" 
        	"ret\n\t" 	            /* restore  rip of next */
        	"1:\t"                  /* next process start here */
        	"popq %%rbp\n\t"
        	: "=m" (prev->thread.sp),"=m" (prev->thread.ip)
        	: "m" (next->thread.sp),"m" (next->thread.ip)
    	); 
    }  
    return;	
}

mypcb.h:

/*
 *  linux/mykernel/mypcb.h
 *
 *  Kernel internal PCB types
 *
 *  Copyright (C) 2013  Mengning
 *
 */

#define MAX_TASK_NUM        4
#define KERNEL_STACK_SIZE   1024*2
/* CPU-specific state of this task */
struct Thread {
    unsigned long		ip;
    unsigned long		sp;
};

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;

void my_schedule(void);

(5)重新编译后的运行结果

        

 

...全文
11 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
入门学习Linux常用必会60个命令实例详解doc/txt
在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。 3.主要参数 --backup[=CONTROL]:为每个已存在的目的地文件进行备份。 -b:类似 --backup,但不接受...
2023-2024-1 20232808 《Linux内核原理分析》第七周作业
【代码】2023-2024-1 20232808 《Linux内核原理分析》第七周作业
2023-2024-1 20232818 《Linux内核原理分析》 第二周作业
【代码】2023-2024-1 20232818 《Linux内核原理分析》 第二周作业
2023-2024-1 20232829《Linux内核分析原理》第一周作业
2023-2024-1 20232829《Linux内核分析原理》第一周作业
2022-2023-1 20222814 《Linux内核原理分析》第七周作业
2022-2023-1 20222814 《Linux内核原理分析》第七周作业
BESTI.Linux内核原理与分析

39

社区成员

53

社区内容

发帖
与我相关
我的任务
社区描述
北京电子科技学院 《Linux内核原理与分析》课程
linuxarm开发系统安全 高校 北京·丰台区
社区管理员
  • rocflytosky
加入社区
  • 近7日
  • 近30日
  • 至今

加载中

查看更多榜单
社区公告
暂无公告

试试用AI创作助手写篇文章吧

+ 用AI写文章

深圳SEO优化公司天水品牌网站设计价格沙井网站改版推荐孝感设计网站推荐白山seo网站优化多少钱长春阿里店铺运营多少钱菏泽百度关键词包年推广推荐黄冈网站制作多少钱盐城seo价格咸阳关键词按天扣费公司南昌关键词排名包年推广推荐固原阿里店铺运营哪家好大连网站推广方案报价商洛网站优化按天计费湘潭网站优化按天计费价格龙华设计网站公司马鞍山关键词排名马鞍山优秀网站设计价格坪地seo网站推广价格鹰潭百度网站优化公司汉中推广网站益阳网络推广报价河池SEO按天收费锦州网站推广方案哪家好福永设计公司网站推荐同乐英文网站建设哪家好镇江SEO按天收费多少钱抚州百度关键词包年推广公司潮州网站关键词优化推荐陇南优秀网站设计价格南阳网络营销歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化