Ucore lab5 操作系统实验

ucore概述(操作系统学习) 本文根据慕课资料进行粗略学习操作系统的知识 ucore课程文档 课程地址 lab答案地址 有的答案有问题,但是可以供参考CPU加电后会进行初始化,然后在内存读第一条指令。内存有一部分是ROM、一部分是RAM。断电后RAM信息会消失,但是ROM内容一直都在。 读的第一个指令是CS:IP指向的地址(值应该是默认的),刚加电的CPU处于16位实模式下,寻址空间大小为2的20次方(1MB),CS、IP都是16位的。CS*16+IP(0xFFFF0)是第一条指令的地址,同时CS:IP要在2的20次方的寻址空间内。第一 阅读详情

LAB5实验报告


实验相关知识

(主要从教学ppt、gitbook、学堂在线上了解掌握并根据优快云查询了解更加详细的信息)

在lab4中我们已经实现了内核线程的管理,本次实验我们将实现用户进程的管理,虽然操作系统对二者的管理体制是较为相似的,但是具体实现上还是有很大差别。基于系统的安全性和可扩展性,ucore要提供用户态进程的创建和执行机制,给应用程序执行提供一个用户态运行环境。

内核线程与用户进程的区别:

  • 内核线程只运行在内核态,用户进程会在在用户态和内核态交替运行
  • 所有内核线程共用ucore内核内存空间,不需为每个内核线程维护单独的内存空间;用户进程需要维护各自的用户内存空间

由于进程的执行空间扩展到了用户态空间,所以在进程管理和内存管理上有较大不同。

  • 内存管理方面,增加用户态虚拟内存的管理。限制用户进程可以访问的物理地址空间,且让各个用户进程之间的物理内存空间访问不重叠,这样可以保证不同用户进程之间不能相互破坏各自的内存空间,利用虚拟内存的功能(页换入换出),给用户进程提供了远大于实际物理内存空间的虚拟内存空间。具体实现时,对页表的内容进行扩展,能够把部分物理内存映射为用户态虚拟内存。如果某进程执行过程中,CPU在用户态下执行(在CS段寄存器最低两位包含有一个2位的优先级域,如果为0,表示CPU运行在特权态;如果为3,表示CPU运行在用户态。),则可以访问本进程页表描述的用户态虚拟内存,但由于权限不够,不能访问内核态虚拟内存。
  • 进程管理方面,主要涉及到的是进程控制块中与内存管理相关的部分,包括建立进程的页表和维护进程可访问空间(可能还没有建立虚实映射关系)的信息;加载一个ELF格式的程序到进程控制块管理的内存中的方法;在进程复制(fork)过程中,把父进程的内存空间拷贝到子进程内存空间的技术。另外一部分与用户态进程生命周期管理相关,包括让进程放弃CPU而睡眠等待某事件;让父进程等待子进程结束;一个进程杀死另一个进程;给进程发消息;建立进程的血缘关系链表。

在lab2的实验报告相关知识部分已经介绍了特权级以及相关转换,在此处再详述一下用户级向内核态的转换:

通常操作系统会采用软中断或者叫做trap的方式完成。实际上,发生中断时已经实现了从用户态切换到内核态,为了实现这种切换,我们需要建立好中断门,中断门中的中断描述符表指出了中断发生后跳转至何处,并且发生中断时我们必须保存SS、ESP等信息。但是,中断会根据保存的这些信息返回到用户态中,为了实现停留在内核态,我们对CS进行修改,将其指向内核态的代码段,其次,我们将CS的CPL设为0,在此处还需要根据要执行的指令修改EIP,这样最后执行IRET指令时,CPU会将堆栈信息取出并返回到EIP以及CS所指内容去执行,从而便实现了从ring3到ring0的转换。
在这里插入图片描述
为了实现特权级的切换,实际上还需要访问TSS(Task State Segment)任务状态段。简单来说,任务状态段就是内存中的一个数据结构。这个结构中保存着和任务相关的信息。当发生任务切换的时候会把当前任务用到的寄存器内容(CS/ EIP/ DS/SS/EFLAGS…)保存在TSS 中以便任务切换回来时候继续使用。

为了访问TSS,还需要访问全局描述符表。全局描述符表(GDT)保存者TSS的地址,TSS最终会被加载进内存中。其中有一个Task Register 的cache缓存,最终通过基址加上偏移来确定Task所在的具体位置。

实验流程

练习0:填写已有实验

本实验依赖实验1/2/3/4。请把你做的实验1/2/3/4的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”的注释相应部分。注意:为了能够正确执行lab5的测试应用程序,可能需对已完成的实验1/2/3/4的代码进行进一步改进.

回答:虽然作业要求不需要在报告中写实验0,但是这次实验0涉及的方面挺多的,有很多改动,故必须说明。

(实际上每次实验最烦的就是实验0…浪费很长时间,并且经常出现bug -.- )

实验0主要将之前4次实验的代码补充进来,包括 kdebug.c、trap.c、default_pmm.c、pmm.c、swap_fifo.c、vmm.c、proc.c七个文件的相关代码。除了直接补充外,有一些地方需要对代码进行修改或者改进:

  • alloc_proc函数:

    在lab4的基础上,又增添了 wait_state ,proc->cptr , proc->optr , proc->yptr 四个变量,实际上只需要将wait_state初始化为0,三个指针初始化为NULL即可。避免之后由于未定义或未初始化导致管理用户进程时出现错误。

    // alloc_proc - alloc a proc_struct and init all fields of proc_struct
    static struct proc_struct *
    alloc_proc(void) {
         
         
        struct proc_struct *proc = kmalloc(sizeof(struct proc_struct));
        if (proc != NULL) 
        {
         
         
            proc->state = PROC_UNINIT;//设置进程为未初始化状态
            proc->pid = -1;          //未初始化的进程id=-1
            proc->runs = 0;          //初始化时间片
            proc->kstack = 0;      //初始化内存栈的地址
            proc->need_resched = 0;   //是否需要调度设为不需要
            proc->parent = NULL;      //置空父节点
            proc->mm = NULL;      //置空虚拟内存
            memset(&(proc->context), 0, sizeof(struct context));//初始化上下文
            proc->tf = NULL;      //中断帧指针设置为空
            proc->cr3 = boot_cr3;      //页目录设为内核页目录表的基址
            proc->flags = 0;      //初始化标志位
            memset(proc->name, 0, PROC_NAME_LEN);//置空进程名
            proc->wait_state = 0;  //初始化进程等待状态  
            proc->cptr = proc->optr = proc->yptr = NULL;//进程相关指针初始化  
        }
        return proc;
    }
    
  • do_fork函数:

    do_fork函数整体未较大改动,主要修改部分为将子进程的父进程设置为 current process ,并且确保current process 的 wait_state 为0,因此我们可以用一个assert()实现该功能。还有就是插入新进程到进程哈希表和进程链表时,设置好相关进程的链接。设置链接的函数为 set_links ,这里较为坑的地方在于set_links函数中已经实现了将进程插入链表并将进程总数加1,因此需要删掉lab4中这两句代码。

    修改的代码:

    	//设置父节点为当前进程
        proc->parent = current;
    	//确保当前进程正在等待
        assert(current->wait_state == 0);
    //------------------------------------
        local_intr_save(intr_flag);
        {
         
         
            proc->pid = get_pid();
            hash_proc(proc);   //将新进程加入hash_list
            // 删除原来的 nr_process++ 和 加入链表 
            set_links(proc);   //执行set_links函数,实现设置相关进程链接
        }
        local_intr_restore(intr_flag);
    
  • trap_dispatch函数:

    主要修改地方在于 当分配给进程的时间片用完时,设置进程为需要被调度

    		ticks ++;
            if (ticks % TICK_NUM == 0)
            {
         
         
                assert(current != NULL);
                //时间片用完设置为需要调度
                //说明当前进程的时间片已经用完了
                current->need_resched = 1;
            }
    
    
  • idt_init函数:

    增添功能为:设置一个特定中断号的中断门,专门用于用户进程访问系统调用。

    设置一个特殊的中断描述符idt[T_SYSCALL],它的特权级设置为DPL_USER,中断向量处理地址在__vectors[T_SYSCALL]处。这样建立好这个中断描述符后,一旦用户进程执行“INTT_SYSCALL”后,由于此中断允许用户态进程产生(注意它的特权级设置为DPL_USER),所以CPU就会从用户态切换到内核态,保存相关寄存器,并跳转到__vectors[T_SYSCALL]处开始执行

       
    extern uintptr_t __vectors[];
        int i;
        for (i = 0; i < sizeof(idt) / sizeof(struct gatedesc); i ++) {
         
         
            SETGATE(idt[i], 0, GD_KTEXT, __vectors[i], DPL_KERNEL);
        
网络攻防技术——MD5碰撞实验 md5collgen原理如下图所示如果MD5(M) = MD5(N),也就是说,MD5哈希的M和N是相同的,那么对于任何输入T,MD5(M || T)= MD5(N || T),其中||表示连接。md5collgen可以生成两个128字节的MD5哈希值相同但内容不同的字节分组,假设为P和Q。并且将P和Q分别连接在一个前缀文件之后(前缀文件的长度一定要是64字节的倍数),那么就可以得到两个内容不同但MD5哈希值相同的文件,其中内容不同体现在最后128个字节中。 阅读详情

相关推荐

实验四 之 5阶幻方实验

《数据结构》实验四:    字符串和多维数组 实验 一.实验目的      巩固字符串和多维数组相关知识,学会运用灵活应用。 1.回顾字符串和多维数组的逻辑结构和存储操作特点,字符和数组的物理存储结构和常见操作。 2.学习运用字符串和和数组的知识来解决实际问题。 3.进一步巩固程序调试方法。 4.进一步巩固模板程序设计。 二.实验内容 写程序输出一个5阶幻方:每

zjh8452086的专栏 1547

《程序设计基础》实验报告(第 5次实验)

设计一个时钟类Clock,数据成员有:时(int hour),分(int minute),秒(int second);成员函数有:构造函数(Clock(int hour=0, int minute = 0, int second =0)),

m0_56144302的博客 1453

Ucore lab5操作系统实验

LAB5实验报告 实验相关知识 (主要从教学ppt、gitbook、学堂在线上了解掌握并根据优快云查询了解更加详细的信息) 在lab4中我们已经实现了内核线程的管理,本次实验我们将实现用户进程的管理,虽然操作系统对二者的管理体制是较为相似的,但是具体实现上还是有很大差别。基于系统的安全性和可扩展性,ucore要提供用户态进程的创建和执行机制,给应用程序执行提供一个用户态运行环境。 内核线程与用...

Ding 的博客 2435

【网络攻防技术】实验三——MD5碰撞实验

一、实验要求 本次实验主要是加深大家对MD5碰撞及其原理的理解,使用SEED实验环境中的工具及编程语言,完成以下任务: a)使用md5collgen生成两个MD5值相同的文件,并利用bless十六进制编辑器查看输出的两个文件,描述你观察到的情况; b)参考Lab3_task2.c的代码,生成两个MD5值相同但输出不同的两个可执行文件。 c)参考Lab3_task3.c的代码,生成两个MD5值相同但代码行为不相同的可执行文件。 d)回答问题:通过上面的实验,请解释为什么可以做到不同行为的两个可执行文件具有相同

qq_45755706的博客 6134

【北京航空航天大学】【信息网络安全实验】【实验一、密码学:DES+RSA+MD5编程实验】

实验说明:使用spdtst1.txt, spdtst2.txt, icons.txt, tensorflow.whl, userdata.img等5个文件测试MD5算法的速度。使用spdtst1.txt, spdtst2.txt, hand.jpg, castle.png, paper.pdf等5个文件测试DES算法的速度。(3)、修改构造的文本文件(修改字母或增删内容),再次计算Hash值,与步骤(2)中Hash值进行比较,看看多少bit发生改变。(2)、记录信息长度:用64位来存储填充前信息长度;

weixin_43031313的博客 3026

ISIS接口MD5 算法认证实验简述

ISIS接口MD5 算法认证实验简述

weixin_42185241的博客 1518

操作系统ucore实验lab1~lab6答案版

操作系统实验ucore,lab1~lab6的完整版,已经完成,供需要者参考。下载后可以分析参考,最好不要直接拷贝,这样学不到多少东西。

基于Ultralytics RT-DETR的工业缺陷检测实战:从NEU-DET数据集准备到模型部署

本文详细介绍了基于Ultralytics框架和RT-DETR模型进行工业缺陷检测的完整实战流程。内容涵盖从NEU-DET数据集准备、YOLO格式转换、环境配置,到模型训练、关键参数调优、性能验证与可视化分析,最后提供了ONNX等格式的模型部署方案,为工业质检场景提供了一套高效、可落地的AI解决方案。

weixin_29168393的博客 339

深度学习分类任务中,正负样本比例失衡的5种实战解决方案(附代码)

本文深入探讨了深度学习分类任务中正负样本比例失衡的5种实战解决方案,包括智能采样技术、动态数据增强、损失函数工程、模型架构创新和训练策略优化。针对信用卡欺诈检测、医疗诊断等场景,提供了详细的代码实现和评估方法,帮助开发者有效解决样本不平衡问题,提升模型在真实场景中的表现。

h9j8k7l6m5n的博客 425

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 374

Unity实时控制佳能单反拍照全流程(附EDSDK 3.6.1配置避坑指南)

本文详细介绍了在Unity中实时控制佳能单反相机进行拍照的完整流程,重点提供了EDSDK 3.6.1的配置与避坑指南。内容涵盖从SDK获取、环境搭建、相机初始化、参数设置到实现拍照控制,并深入探讨了实时取景的延迟优化方案与资源管理,旨在帮助开发者高效集成专业相机,提升AR/VR及摄影测量等应用的视觉输入质量。

go5gopher的博客 184

卷积层 (Convolutional Layer) 原理与代码实例讲解

卷积层 (Convolutional Layer) 原理与代码实例讲解 关键词:卷积层,卷积操作,滤波器,特征提取,神经网络 1. 背景介绍 卷积神经网络 (Convolutional N

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 769

C# 工业视觉性能极致优化:多线程推理池 + 对象复用 + 批量检测,速度提升 10 倍实战

set;} // 输入图像set;} // 异步返回结果set;} // 用于监控延迟性能优化不是魔法,而是对资源生命周期的精细管理和对硬件特性的充分利用。多线程池解决了 CPU/GPU 闲置问题。对象池解决了 GC 停顿问题。零拷贝解决了总线带宽瓶颈。严格的 Dispose解决了内存泄漏问题。这套架构已在多个高速锂电、3C 电子检测产线落地,轻松应对 200ms 甚至 50ms 的严苛节拍。记住,在工业领域,稳定性与速度同等重要。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 303

泛微系统流程表单获取节点操作者

泛微系统流程表单获取节点操作者 select typename 流程类型, workflowname 流程名称, nodename 节点名称, (case when nodetype=0 then '创建' when nodetype=1 then '审批' when nodetype=2 then '提交' when nodetype=3 then '归档' else '' end) as 节点类型, groupname 节点操作组, (case when type=1 then '部门+安

烧硬盘 4613

Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配

目前阻抗匹配多直接有制版厂进行,PCB设计师在设计阶段可不关注阻抗设计,在加工阶段只需标注需要控制的阻抗线,制板厂即可按照要求对阻抗线进行调整和控制。但是对于设计师来讲掌握阻抗线的设计方法也是非常必要的。本文介绍Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配。

fydar的博客 893

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 对比first-fit/best-fit/worst-fit/slab以及buddy这几种算法的特点
下一篇: Ucore Lab6 操作系统实验
coding丁
博客等级 码龄9年 383粉丝 147原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值