ucore-lab1-练习4report】的更多相关文章

资源 ucore在线实验指导书 我的ucore实验代码 练习1:理解通过make生成执行文件的过程 详见<ucore lab1 exercise1>实验报告 练习2:使用qemu执行并调试lab1中的软件 详见<ucore lab1 exercise2>实验报告 练习3:分析bootloader进入保护模式的过程 详见<ucore lab1 exercise3>实验报告 练习4:分析bootloader加载ELF格式的OS的过程 详见<ucore lab1 exe…
---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0))开始执行.在0xFFFFFFF0这里只是存放了一条跳转指令,通过跳转指令跳到BIOS例行程序起始点.BIOS做完计算机硬件自检和初始化后,会选择一个启动设备(例如软盘.硬盘.光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那…
资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_stackframe来跟踪函数调用堆栈中记录的返回地址.如果能够正确实现此函数,可在lab1中执行 "make qemu"后,在qemu模拟器中得到类似如下的输出: ebp:0x00007b28 eip:0x00100992 args:0x00010094 0x00010094 0x0000…
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分析bootloader是如何完成从实模式进入保护模式的. 提示:需要阅读小节"保护模式和分段机制"和lab1/boot/bootasm.S源码,了解如何从实模式 切换到保护模式,需要了解: 为何开启A20,以及如何开启A20 如何初始化GDT表 如何使能和进入保护模式 解答 正如提示所言,…
资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行. 在初始化位置0x7c00设置实地址断点,测试断点正常. 从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和bootblock.asm进行比较. 自己找一个bootloader或内核中的代码位置,设置断点并进行测试 解答 问题1:从CPU加…
资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关键知识点. 操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果) 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么? 解答 题目1的解答 等完成lab1后再回头总结. 题目2的解答 首先具体分析Ma…
一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站在应用程序开发人员的角度来看,日常开发中常见的各种关于并发.I/O.程序通信的问题等都和操作系统相关,因此一定程度上了解底层的操作系统工作原理是有必要的. 另一方面,由于操作系统自身功能的复杂性,整体设计一般会有一个好的模块化架构:操作系统作为基础服务,对性能效率的要求也很高,底层会用到许多关于数据…
练习一 Makefile 1.1 OS镜像文件ucore.img 是如何一步步生成的? + cc kern/init/init.c + cc kern/libs/readline.c + cc kern/libs/stdio.c + cc kern/debug/kdebug.c + cc kern/debug/kmonitor.c + cc kern/debug/panic.c kern/debug/panic.c: In function '__panic': kern/debug/panic…
本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全程使用普通管理员身份操作 切换普通管理员,cd回到Home目录,在git上下载ucore_lab到用户文件夹($ git clone https://github.com/chyyuu/ucore_lab.git),然后切换到lab1_result文件夹 make ,最后make lab1-mon就…
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader加载ELF格式的OS的过程 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootloader&OS,理解: bootloader如何读取硬盘扇区的? bootloader是如何加载ELF格式的OS? 解答 问题1:bootloader如何读取硬盘扇区 分析原理 阅读材料其实已经给出了读一个扇区的大致流程: 等待磁盘准备好 发出读取扇区的命令…
资源 ucore在线实验指导书 我的ucore实验代码 题目:完善中断初始化和处理 请完成编码工作和回答如下问题: 中断描述符表(也可简称为保护模式下的中断向量表)中一个表项占多少字节?其中哪几位代表中断处理代码的入口? 请编程完善kern/trap/trap.c中对中断向量表进行初始化的函数idt_init.在idt_init函数中,依次对所有中断入口进行初始化.使用mmu.h中的SETGATE宏,填充idt数组内容.每个中断的入口由tools/vectors.c生成,使用trap.c中声明的…
开头赞美THU给我们提供了这么棒的资源.难是真的难,好也是真的好.这种广查资料,反复推敲,反复思考从通电后第一条代码搞起来理顺一个操作系统源码的感觉是真的爽. 1. 操作系统镜像文件ucore.img是如何一步一步生成的? 这makefile文件逻辑简略着看都能明白,仔细了瞧却处处有疑问,有的地方还用到了二重展开.对于初学者来讲,细读这东西太痛苦了,还是简略着读吧. # create kernel target kernel = $(call totarget,kernel) $(kernel)…
1. ucore lab3介绍 虚拟内存介绍 在目前的硬件体系结构中,程序要想在计算机中运行,必须先加载至物理主存中.在支持多道程序运行的系统上,我们想要让包括操作系统内核在内的各种程序能并发的执行,而物理主存的总量通常是极为有限的,这限制了并发程序的发展.受制于成本问题,拥有足够大容量主存的个人计算机是普通人承受不起的.因此计算机科学家们另辟蹊径,想到了利用局部性原理来解决既要能并发运行大量程序又要使计算机足够低成本这一矛盾问题. 局部性原理告诉我们,大多数程序通常都在执行循环逻辑,访问数据时…
1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让出CPU给其它程序使用,令宝贵的CPU资源得到更充分的利用. 操作系统作为大总管需要协调管理各个程序对CPU资源的使用,为此抽象出了进程(Process)的概念.进程顾名思义就是进行中.执行中的程序. 物理层面上,一个CPU核心同一时间只能运行一个程序,或者说一个CPU核心某一时刻只能归属于一个特定…
1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步,实现我们平常开发接触到的.运行在用户态的进程/线程机制.用户线程通常用于承载和运行应用程序,为了保护操作系统内核,避免其被不够鲁棒的应用程序破坏.应用程序都运行在低特权级中,无法直接访问高特权级的内核数据结构,也无法通过程序指令直接的访问各种外设. 但应用程序访问高特权级数据.外设的需求是不可避免…
1. ucore lab6介绍 ucore在lab5中实现了较为完整的进程/线程机制,能够创建和管理位于内核态或用户态的多个线程,让不同的线程通过上下文切换并发的执行,最大化利用CPU硬件资源.ucore在lab5中使用FIFO的形式进行线程调度,不同的线程按照先来先服务的策略,直到之前创建的线程完全执行完毕并退出,后续的线程才能获得执行机会. FIFO的策略固然简单,但实际效果却非常差.在非抢占的FIFO调度策略中,如果之前的线程任务耗时很长,将导致后续的线程迟迟得不到执行机会而陷入饥饿:即使…
1. ucore lab7介绍 ucore在前面的实验中实现了进程/线程机制,并在lab6中实现了抢占式的线程调度机制.基于中断的抢占式线程调度机制使得线程在执行的过程中随时可能被操作系统打断,被阻塞挂起而令其它的线程获得CPU.多个线程并发的执行,大大提升了非cpu密集型应用程序的cpu吞吐量,使得计算机系统中宝贵的cpu硬件资源得到了充分利用. 操作系统提供的内核线程并发机制的优点是明显的,但同时也带来了一些问题,其中首当其冲的便是线程安全问题. 并发带来的线程安全问题 线程安全指的是在拥有…
一.实验内容 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootloader&OS, bootloader如何读取硬盘扇区的? bootloader是如何加载ELF格式的OS? 二.实验相关 ELF文件格式 ELF(Executable and linking format)文件格式是Linux系统下的一种常用目标文件(object file)格式,有三种主要类型: 用于执行的可执行文件(executable file),用…
Intel 80386 ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统. Intel 80386是80x86系列中的第一种32位微处理器.80386的内部和外部数据总线都是32位,地址总线也是32位,可寻址高达4GB内存. 工作方式包括实模式.保护模式以及虚拟86模式. Bootloader 我们知道计算机启动是从BIOS开始,再由BIOS决定从哪个设备启动以及启动顺序,比如先从DVD启动再从硬盘启动等.计算机启动后,BIOS根据配置找到启动设备,并读取这个设备的第0个…
Lab1 : bootloader 启动 ucore os 一.内容提要 x86启动顺序 C函数调用 gcc内联汇编(inline assembly) x86-32下的中断处理 小结 二.x86启动顺序 寄存器初始值 第一条指令(CS=F000H, EIP=0000FFF0H) 实际地址是: Base + EIP 当CS被新值加载,则地址转换规则则将开始起作用 通常第一条指令是一条长跳转指令(这样CS和EIP都会跳转到BIOS代码中执行) 处于实模式的段 段选择子(segment selecto…
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做一个汇总,也为之后的lab打下坚实的基础.80386真的难啊,比mips复杂多了..顿时觉得我们学的都是小菜.. 下面这些知识来源于: 实验指导书和答案 80386手册 mooc视频 8086程序设计指导这本书 网上的博客 lab1练习汇总 练习之所以被老师当做练习,一定有它重要的地方,所以我们先把…
ucore是清华大学操作系统课程的实验内核,也是一个开源项目,是不可多得的非常好的操作系统学习资源 https://github.com/chyyuu/ucore_lab.git, 各位同学可以使用git下载源码和文档. 本文我会对项目中的code/lab1/boot/bootasm.S文件进行完全注释. # Start the -bit protected mode, jump into C. # The BIOS loads this code from the first sector o…
lab1 源码剖析 从实模式到保护模式 初始化ds,es和ss等段寄存器为0 使能A20门,其中seta20.1写数据到0x64端口,表示要写数据给8042芯片的Output Port;seta20.2写数据到0x60端口,把Output Port的第2位置为1,从而使能A20门. 建立gdt,此处只设置了两个段描述符,分别对应代码段和数据段 gdt: SEG_NULLASM # null seg SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg…
资源 ucore在线实验指导书 我的ucore实验代码 练习1: 加载应用程序并执行(需要编码) 题目 do_execv函数调用load_icode(位于kern/process/proc.c中) 来加载并解析一个处于内存中的ELF执行文件格式的应用程序,建立相应的用户内存空间来放置应用程序的代码段.数据段等,且要设置好proc_struct结构中的成员变量trapframe中的内容,确保在执行此进程后,能够从应用程序设定的起始执行地址开始执行.需设置正确的trapframe内容. 请在实验报告…
ucore Lab0 一些杂记 前一阵子开始做 MIT 6.828,做了两三个实验才发现清华的 ucore 貌似更友好一些,再加上前几个实验也与6.828 有所重叠,于是决定迁移阵地. 文章计划分两类,一类是代码的分析,另一类是实验的解答和比较. 1. 计算机执行第一条指令之前,分段状态是怎样的? 执行make debug, 然后考察 QEMU monitor 中 GDT 的值: GDT= 00000000 0000ffff 参考 GDTR 寄存器: 参考手册 2.4.1 节描述: On pow…
一.lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源. 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管理.最初没有操作系统的情况下,不同的程序通常直接编写物理地址相关的指令.在多道并发程序的运行环境下,这会造成不同程序间由于物理地址的访问冲突,造成数据的相互覆盖,进而出错.崩溃. 现代的操作系统在管理内存时,希望达到两个基本目标:地址保护和地址独立. 地址保护指的是一个程序不能随意的访问另一个程序的空间,而地址独立指的…
任务:阅读实验一makefile 搞清楚ucore.img是如何构建的 $@  $<  $^  这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/article/details/36898505 =和:=的区别 https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a dd命令 http:…
总的来讲把的LAB1代码逻辑理顺后再往后学就轻松了一大截.LAB2过遍课程视频,再多翻翻实验指导书基本上就没遇到啥大坎儿.对这节学得东西做个总结就是一张图: 练习0:填写已有实验 本实验依赖实验1.请把你做的实验1的代码填入本实验中代码中有"LAB1"的注释相应部分. 提示:可采用diff和patch工具进行半自动的合并(merge),也可用一些图形化的比较/merge 工具来手动合并,比如meld,eclipse中的diff/merge工具,understand中的diff/merg…
实验1 :bootload启动ucore os 1.0实验内容: lab1中包含一个bootloader和一个OS.这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符.而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS.bootload(引导装入)的翻译. Lab1主要是关于操作系统如何启动,以及如何中断,函数调用栈相关的知识. 1.1 x86启动顺序 硬件启动后,怎么把操作系统放到内存中去运行. 1 BIOS启动过程 从BIOS…
MIT6.828 lab1地址:http://pdos.csail.mit.edu/6.828/2014/labs/lab1/ 第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的. Part 1: PC Bootstrap 首先,整个实验使用qemu这款模拟软件来,来对代码进行调试,相当于我们在qemu这个模拟的计算机平台上,运行自己的程序.可以再qemu这个软件上进行gdb的调试,比较方便. 首先看下整个内核在qemu上的模拟的结果: 整个内核现在能实现的就两个功能,一个kerninfo,显示…