这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...这些异常也正是我们编写操作系统所需要实现的。 Supervisor mode: 通常为操作系统使用,可以访问一些 supervisor 级别的寄存器,通过这些寄存器对中断和虚拟内存映射进行管理。...stval:需要访问但是不在内存中的地址,包含信息 指导硬件处理中断: stvec:设置内核态中断处理流程的入口地址。
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...(例如 argc 和 argv等 ) 思考:为什么线程即便与操作系统无关,也需要在内存中映射操作系统的内存空间呢?...我们会为每个进程的页表映射全部操作系统的内存,这些页表都标记为内核权限(即 U 位为 0)。...("thread {}", message); } } } 尝试运行: 线程的结束 如果我们按照实验指导中的实现,应该会观察到:内核线程在运行完成后触发了 Exception::...此时操作系统观察到线程的标记,便将其终止。
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...rcore-os/rCore-Tutorial lab5 学习报告 lab5 涉及: 设备树的概念和读取 virtio 总线协议 块设备驱动的实现 将块设备托管给文件系统 这一部分其实在 lab4 的实验中就已经可以部分接触到了...而操作系统就是通过这些节点上的信息来实现对设备的识别的。...接下来我们需要让操作系统理解块设备里面的文件系统。
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...rCore tutorial的第三版:https://github.com/rcore-os/rCore-Tutorial lab2 学习报告 这部分的代码从上一章 lab1 的代码开始完成: 这一章的实验指导中...支持动态内存分配的方法 连续内存分配算法: 使用 Buddy System 来实现: 这里可以试着调用 Buddy System Allocator 的轮子: 操作系统动态分配内存所用的堆大小(8M)...这一部分是内核的堆分配,参考 memory/heap.rs: #[global_allocator] static HEAP: LockedHeap = LockedHeap::empty(); /// 初始化操作系统运行时堆空间...缺省 128MB,大小可配置 首先建立一个 PhysicalAddress 的类,然后对其实现一系列的 usize 的加、减和输出等等操作; 直接将 DRAM 物理内存结束地址硬编码到内核中:记录下操作系统用到的地址结尾
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...): Linux ubuntu 5.4.0-26-generic #30-Ubuntu SMP Mon Apr 20 16:58:30 UTC 2020 x86_64 x86_64 x86_64 GNU.../Linux 已换源至阿里云,但版本过低; 安装 QEMU 先 sudo apt-get install build-essential 安装编译工具链; 下载源码编译: wget https://...fn console_getchar() -> usize { sbi_call(SBI_CONSOLE_GETCHAR, 0, 0, 0) } /// 调用 SBI_SHUTDOWN 来关闭操作系统...任何没有注释的地方都会产生警告:这个属性用来压榨写实验指导的学长,同学可以删掉了 #![warn(missing_docs)] //!
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...这里参考的是rCore tutorial的第三版:https://github.com/rcore-os/rCore-Tutorial lab6 学习报告 这一章的实验指导包含: 单独生成 ELF...基础框架搭建 和操作系统一样,我们需要为用户程序移除 std 依赖,并且补充一些必要的功能: 在 lib.rs 中添加: 声明 堆栈相关 panic 处理 入口函数 #![no_std] #!...// 添加线程 PROCESSOR.lock().add_thread(thread); 实现系统调用 为练习做准备: sys_read sys_write sys_exit 用户程序中调用系统调用 实验指导提供了这样一种系统调用格式...因此,我们来看看外部中断的实现: 每一个键盘按键对于操作系统而言都是一次短暂的中断: OpenSBI 默认会关闭各种外部中断,需要将其打开,来接受按键信息。
...
实验内容 本实验通过编程模拟实现几种常见的磁盘调度算法 简直可怕,怎么可能写出来磁盘调度算法啊喂!算法实现倒还好说,就是一个排序算法。但是!访问的柱面就是随机生成的所以还要写iterator?!...cout<<endl<<endl; } int choose_algorithm(vectorm_vec){ cout<<endl<<endl; cout<<"本实验可用的调度算法有以下...cout<<endl<<endl; return 1; } int main(){ cout<<"---------------磁盘调度算法模拟实验
(这里似乎有个问题,但还是按指导书上来了。
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily...lab2 中涉及通过页的方式对物理内存进行管理: 在 lab3 中主要涉及: 虚拟地址和物理地址的概念和关系 利用页表完成虚拟地址到物理地址的映射 实现内核的重映射 这一部分的代码将会在 lab2 的实验结果上面继续添加...; 从虚拟内存到物理内存 原理 在现代的操作系统中,为了让其他的程序能方便的运行在操作系统上,需要完成的一个很重要的抽象是「每个程序有自己的地址空间,且地址空间范围是一样的」,这将会减少了上层程序的大量麻烦...这样的设计会导致上层的应用程序可能会访问同一个值相等的虚拟地址,所以操作系统需要做的就是替这些程序维护这个虚拟地址到物理地址的映射。甚者,为了统一和连贯,内核自己本身访问内存也将会通过虚拟地址。...此时操作系统会介入,交换一部分物理内存和磁盘中的数据,使得需要访问的内存数据被放入物理内存之中。操作系统还必须更新页表,并刷新缓存。
[TOC] 实验一 OS启动过程、进程的概念及cmd.exe中的命令等 1、 实验目的 了解计算机启动过程的原理。...创建进程、撤销进程原语程序fork()、exec()和exit()CreateProcess()和ExitProcess() 2、实验时间:2学时,分两次 3、实验任务: 百度fork()、exec()...4、实验过程: 实验一:百度fork()、exec()和exit()源程序,写出它们的功能 Fork():一个进程,包括代码、数据和分配给进程的资源。...实验二:通过启动任务管理器运行和撤销资源管理器 实验三:了解cmd.exe所拥有的内部和外部命令 内部命令:我们可以直接在cmd下就可以执行的命令,例如:telnet、ftp、cd、等等,你可以在CMD...四、 读者和写者算法 (1) 写者优先 (2) 读者优先 五、哲学家就餐算法 六、验证参考程序 七、 编写自己的程序 2、实验时间:4学时(2次) 3、实验任务: (1)验证参考程序Java,观察程序运行的结果
本实验是要求在linux环境下测试fork()和exec(),并建立一个简单的shell(带cd、env、echo、help、jobs、quit命令) fork() 这一节没啥难度,主要是测试当前linux...环境下gcc是否能编译成功 清单 2-1 创建进程 #include //此处指导书上没有 int main (){ int x; while((x=fork()...)==-1); if (x==0) printf("a"); else printf("b"); printf("c"); } 这里出现了很奇妙的问题,指导书上没有使用...但是加上了以后又出现了一个坑,实验室里的linux没有安装gcc的包依赖。...install build-essential //此处也许会失败,提示缺少几个依赖,那就安装相应的包 $ sudo apt-get install g++ //上一步如果不行就运行这个再运行上一条 linux
前言 实验阶段,由于学校网速等条件限制,未能在真机上搭建出实验环境。在实验楼中,将代码粘贴进去出现严重的缩进错位,最终未能完成编译新的。本文以分析关键代码为主。...环境搭建简易过程 1、创建(mkdir)工作区SG13225146 2、将linux-3.9.4文件夹剪切到刚创建工作区SG13225146 3、将mykernel_for_linux3.9.4sc.patch...linux原内核工作状态 实验及总结 主要代码及分析 各文档所包含的头文件不在列出 mypcb.h 这个头文件主要定义了进程控制结构PCB mypcb.h #define MAX_TASK_NUM 4...This is process %d + n",my_current_task->pid); } } } 代码解析 my_start_kernel可以看做操作系统的入口...即操作系统通过CUP执行进程的同时判断分配到的时间片是否用完,当用完时保存当前中断现场的相关信息并进行进程调度,开始另一个进程,当另一个进程的时间片用完时,再回到之前中断的地方恢复并继续执行后面的内容,
/* " 0"表示未分配即空闲 " 1"表示分配位示图大小按照行优先的分配方式进行分配初始化全为未分配" 0"*/ #include<stdio.h> #inc...
这里作者就先实现了两种置换方法 第一种就是先进先出算法 第二种就是最久未使用算法 首先看到先进先出,我们最容易想到的就是队列了,所以实现起来比较简单 第...
句柄 指导书上出现了一个陌生的名词“句柄(handle)”,感觉比较奇妙,因为在之前编写微信公众号小程序看教程也编写了一个handle程序。所以留档一下吧。...当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。 第二种解释:整个Windows编程的基础。...实验一中相关函数解释 参考MSDN 中的帮助文件 CreateMutex() 、 OpenMutex() 、 ReleaseMutex() 和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的
三、实验仪器、设备 PC一台 + Windows 操作系统 + Anaconda Distribution(Python 3.X)安装文件,要求能够上网。...目前Python支持的操作系统包括主流的Windows、Linux、Mac OS等。...编者采用的操作系统为Windows,故下载Windows对应的安装器,如图1-3所示。...pip install PackageFilename.whl (八)修改Jupyter默认工作空间 在Windows上使用jupyter notebook不像Linux,Linux是在哪个目录下启动,...七、实验报告要求 实验报告以书面/电子形式提交,严禁抄袭,一旦发现,即为零分。 实验报告主要内容包括实验名称、实验类型、实验地点、学时、实验环境、实验原理、实验步骤、实验结果、总结与思考等。
从运行结果中能看到,生产的速度大于消费,生产者就要经常等待;生产速度小于消费,消费者就需要经常等待。步骤3中,线程的第一个执行函数是Producer,位于第三...
实验三 进程调度 一、实验目的 1、 理解有关进程控制块、进程队列的概念。 2、 掌握进程优先权调度算法和时间片轮转调度算法的处理逻辑。...二、实验内容与基本要求 1、 设计进程控制块PCB的结构,分别适用于优先权调度算法和时间片轮转调度算法。 2、 建立进程就绪队列。 3、 编制两种进程调度算法:优先权调度算法和时间片轮转调度算法。...三、实验报告要求 1、 优先权调度算法和时间片轮转调度算法原理。 2、 程序流程图。 3、 程序及注释。 4、 运行结果以及结论。...四、实验报告 1.时间片轮转调度算法(round robin) a.该算法采取了非常公平的方式,即让就绪队列上的每个进程每次仅运行一个时间片。
4、配置网络:为网卡添加一个本网段IPV4地址,x.x.x.123,并启用,然后在阿里镜像站GNU里,下载wget2的包-
领取专属 10元无门槛券
手把手带您无忧上云