自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 Rust学习笔记1

Rust学习笔记1.Tuples,Arrays和slice的区别Tuples是不同类型元素的集合,Arrays和slice是相同元素的集合。但是不同之处在于,arrays在编译时就知道其长度,而slice在编译时不知道其长度。slice经常用来取arrays的某一部分作为切片,如下面的例程所示:use std::mem;// This function borrows a slicefn analyze_slice(slice: &[i32]) { println!("first

2021-07-09 16:05:42 179 2

原创 Slice-aware实验复现

Slice-aware实验复现L3-access-measurement实验该部分实验,测量单核CPU对各个LLC的slice的访问时间,探究访问不同的slice的访问时间是否会有所区别。CPU核的绑定现在的CPU都是多核的,要实现CPU单核访问时间的测量,首先要进行CPU核的绑定。线程的affinity mask决定了哪一组CPU核来运行该线程,因此通过设置线程的affinity mask来实现哪一组CPU核来运行该线程。代码实现:/* * Pin program to the input

2021-01-08 17:02:08 208

原创 Mit 6.828_Lab6_Part B

Part B: Receiving packets and the web serverReceiving Packets就像传输数据包一样,您必须为E1000配置接收数据包的功能,并提供接收描述符队列和接收描述符。 3.2节描述了数据包接收的工作方式,包括接收队列结构和接收描述符,初始化过程在14.4节中进行了详细说明。exercise 9:阅读第3.2节。 您可以忽略有关中断和校验和卸载的任何信息(如果您以后决定使用这些功能,可以返回到这些部分),并且不必担心阈值的详细信息以及卡的内部缓存如何工作

2020-12-03 19:10:22 271

原创 Mit6.828_Lab 6_Part A

Lab 6: Network Driver (default final project)QEMU’s virtual network我们将使用QEMU的用户模式网络堆栈,因为它的运行不要求任何管理权限。我们已经更新了makefile,以启用QEMU的用户模式网络堆栈和虚拟E1000网卡。默认情况下,QEMU提供一个在IP地址 10.0.2.2上运行的虚拟路由器,并将为JOS分配IP地址10.0.2.15。 为简单起见,我们将这些默认值硬编码到net / ns.h中的网络服务器中。尽管QEMU的虚拟

2020-12-02 16:06:21 382

原创 Mit6.828_Lab5 File system, Spawn and Shell

MIT6.828学习笔记(讲义)讲义是基于xv6系统内核来进行阐述的,xv6的所有系统调用如下:操作系统的三个重要需求:多路复用,隔离和交互。

2020-11-25 15:05:13 357

原创 Lab 4 Part C

Lab 4 Part CLab4的part c,我们将实现一个进程抢占机制并实现进程间通信。Clock Interrupts and PreemptionInterrupt disciplineexercise 13:修改kern/trapentry.S和kern/trap.c来初始化IDT中的表项并且为IRQs0-15的外部中断提供处理函数,然后修改kern/env.c中的env_alloc()确保用户进程在开中断状态下运行,还要取消对sched_halt()中sti指令的注释.这样空闲的cpu也

2020-11-19 16:16:14 167 1

原创 Lab4 Part B

Part B: Copy-on-Write Fork传统的fork()执行时,子进程会复制父进程地址空间的内容,但一般来说在子进程中exec()会在fork()之后马上就调用,而exec()将替换掉子进程复制来的内存。在这种情况下,fork()复制父进程的内存就显得很没有必要了(因为在调用exec()之前,这一部分复制来的内存基本没有用上),因此后面的unix系统中引入了写时复制技术(copy-on-write)。内核在fork()上将地址空间映射从父进程复制到子进程,而不是将实际页面的内容复制过去,同

2020-11-17 21:15:08 123

原创 Lab4_partA

Part A: Multiprocessor Support and Cooperative MultitaskingMultiprocessor Support在SMP系统中,每个CPU都有一个随附的本地APIC(LAPIC)单元。 LAPIC单元负责在整个系统中传递中断。 LAPIC还为其连接的CPU提供唯一的标识符。处理器使用内存映射的I / O(MMIO)访问其LAPIC。 LAPIC的Hole开始于物理地址0xFE000000(4GB下的32MB),但是这地址太高,我们无法访问。 JOS虚拟内

2020-11-12 15:33:56 188

原创 Lab3 Part B

Part B: Page Faults, Breakpoints Exceptions, and System Callsexercise 5:修改trap_dispatch()来将页面错误异常调度到page_fault_handler()。修改后,makegrade测试一下,看看是否通过了faultread, faultreadkernel, faultwrite, and faultwritekernel的检查。如果其中任何一个不起作用,找出原因并修复。我们可以使用make run-x或make ru

2020-11-09 21:15:33 145

原创 Lab3 User Environments

Lab3 User EnvironmentsNote:在本lab中需要注意,进程和环境的意思是相同的。在 kern/env.c文件中定义了三个与环境有关的全局变量:struct Env *envs = NULL; // All environmentsstruct Env *curenv = NULL; // The current envstatic struct Env *env_free_list; // Free environment list像Unix进程一样,JOS进程将“线程

2020-11-07 18:12:23 248

原创 Lab2 part3

part3 Kernel Address SpaceULIM是用户内存和内核内存的分界线。用户环境将不具有ULIM之上的任何内存的权限,而内核将能够读取和写入该内存。对于地址范围[UTOP,ULIM),内核和用户环境都具有相同的权限:它们可以读取但不能写入该地址范围。该地址范围用于向用户环境公开某些内核数据结构。最后,UTOP下的地址空间供用户环境使用;用户环境将设置访问该内存的权限。exercise5 补全mem_init()中剩余的代码。...

2020-11-03 16:33:17 100

原创 Lab2 part2

Lab 2: Memory Managementpart2 Virtual Memory首先完成exercise2,exercise2要求阅读intel 80386参考手册的第五章和第六章。Chapter 5 Memory Management80386通过以下两步将虚拟地址转换为物理地址:1.段转换,逻辑地址(包含段选择器和段偏移量)会被转换成线性地址2.页转换,线性地址会被转化成对应的物理地址,这一步是可选的,由操作系统设计人员决定这两个转化过程对操作人员来说是不可见的,过程大致如下图所

2020-11-03 15:36:21 155

原创 Lab2 Memory Management(part1)

Lab 2: Memory Management本实验将为我们自己的内核编写内存管理模块,内存管理模块分为两个部分:第一个部分是内核的物理模块分配器,以便内核分配和释放物理内存,分配器将以4096字节为单位操作,称为页面。第二个部分是虚拟内存管理单元,它将内核和用户软件使用的虚拟地址映射到物理内存中的地址。...

2020-10-30 14:26:13 159

原创 HW2 shell

HW2 Shell6.828的shell主要有两个功能,一个是解析shell命令,一个是执行它们。6.828可以识别普通命令,重定向和pipe管道等。1.普通exec命令的实现在case’ '中直接实现即可,根据提示用到了unistd.h头文件中的execv方法根据man 3 exec显示的提示可以看到:execv的第一个参数是路径,第二个参数是一个数组。根据详细描述可以知道,execv的第一个参数是和文件路径相联系的,所以我们可以简单地写出应用逻辑如下: //exec case ' ':

2020-10-27 19:46:09 727

原创 preparation

Prepartion学习2.9 (Bitwise operators), 5.1 (Pointers and Addresses) through 5.5(Character Pointers and Functions) and 6.4 (pointers to structures) in K&R。Bitwise operators其中^表示按位异或,~表示求补。必须区分位运算符&,|和逻辑运算符&&,||。For example, if x is 1 and y

2020-10-23 16:19:54 206

原创 HW1 boot xv6

HW11.安装,编译xv6mkdir xv6cd xv6git clone git://github.com/mit-pdos/xv6-public.git编译:cd xv6-publicmake2.寻找内核的入口地址:nm kernel | grep _start可以看到,_start的地址是0x10000c,所以内核的入口地址为0x10000c。设置断点...

2020-10-17 16:48:29 337

原创 Mit6.828-PC hardware and x86

PC architecturePC机的抽象模型为:x86的寻址方式:堆栈的使用方式(x86的堆栈是向下生长的):8086的寄存器是16位的,然而地址总线是20位的。如何实现16位寄存器映射20位总线地址呢?这是由4个段寄存器实现的。80386是32位cpu,其地址总线和数据总线均是32位的,这种情况下CPU结构可以设计得简单明了,但由于80386是行x86系列的一员,必须向前兼容,因此保留了段寄存器和实模式,保护模式等。有关讲解可以参考这篇博客:https://blog.csdn.net/c

2020-10-15 15:22:46 115

原创 Mit6.828lab1 part3

Part3 The kernel我们已经知道引导加载程序的链接地址和加载地址是一致的,但是对于内核来说,则完全不同,内核的链接地址和加载地址是不一致的。操作相同内核经常链接和运行在高的虚拟地址上,例如:0xf0100000,以便于把低的虚拟地址留给用户程序运行。但是很多机器可能并没有0xf0100000那么高的物理地址空间,因此我们会使用处理器将0xf0100000的虚拟地址映射到0x00100000的物理地址上。这样做的结果是虽然内核的虚拟地址在0xf0100000这么高的地址上,但实际加载时仅仅

2020-10-15 10:13:19 147

原创 MIT 6.828学习笔记(lab1)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2020-10-12 15:37:04 1091

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除