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的完整版,已经完成,供需要者参考。下载后可以分析参考,最好不要直接拷贝,这样学不到多少东西。

基于LORA的双机通信的智能农业系统

通过LoRa模块与主机进行通信,监测环境中的温度、湿度、土壤湿度和光照强度等参数,并根据预设的自动控制逻辑或者手动指令控制继电器开关,从而调节风扇、加热器、水泵、喷雾器和灯光等设备,为植物提供适宜的生长环境。使用的Lora是大夏龙雀的感觉这个是我使用过的Lora里面最好用的,因为不用设置频道就可以直接透明传输,使用起来得心应手。就像两个单片机直接串口通信一样,缺点是异步串行,不能同时进行接收和发送。继电器灯亮模拟打开对应的风扇、水泵、灯、喷雾、加热。1.使用温度传感器测当前环境的温湿度。

ssjsjss的博客 1739

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1498

光流法实战:如何用OpenCV的Farneback算法实现图像对齐(附调参技巧)

本文详细介绍了如何使用OpenCV的Farneback稠密光流算法实现图像对齐,包括核心原理、参数调优和工程实现。通过实战代码和参数优化策略,帮助开发者解决动态场景中的图像对齐问题,提升多帧融合和视频处理的效果。

weixin_29266007的博客 291

TP-LINK电信定制摄像头刷机教程:解锁官方功能与固件升级

固件是嵌入式设备的操作系统,控制着硬件的基础功能。其工作原理是通过更新或替换存储在设备非易失性存储器中的程序代码,从而改变设备的行为和功能。这项技术的核心价值在于赋予用户对设备的完全控制权,能够解除厂商或运营商的软件限制,实现功能自定义、性能优化和安全更新。在智能家居、网络设备和物联网领域,固件升级与刷机是常见的工程实践,用于修复漏洞、增加新特性或适配不同平台。本文聚焦于利用TFTP恢复模式这一通用网络设备维护机制,针对TP-LINK电信定制版摄像头,提供一套完整的刷机方案,将设备刷入官方通用版固件,以解除

weixin_34205826的博客 492

告别玄学调参:手把手教你用LSTM-AutoEncoder为传感器数据做异常检测(实战篇)

本文详细介绍了LSTM-AutoEncoder在传感器数据异常检测中的工程化实践,包括数据预处理、模型架构设计和生产环境部署策略。通过结合LSTM的时间序列处理能力和AutoEncoder的特征提取优势,该方法能够有效识别温湿度、PM2.5等传感器数据的异常模式,适用于工业物联网和室内空气质量监测等场景。

weixin_29212429的博客 477

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6273

【虚幻引擎UE】UE5 仅需6步轻松实现关卡顺滑切换

【虚幻引擎UE】UE5 仅需6步轻松实现关卡切换

灵境引路人 2万+

【报错】open /var/lib/docker/tmp/docker-import-863402796/bin/json: no such file or directory

然后,通过docker images可以看到镜像已经加载进来了。然后,通过docker images可以看到镜像已经加载进来了。

静谧、淡雅 6223

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 对比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、付费专栏及课程。

余额充值