
【mit 6.S081】学习笔记
文章平均质量分 56
【mit 6.S081】学习笔记
不归醉
这个作者很懒,什么都没留下…
展开
-
【mit 6.S081】学习笔记 Lab10 Mmap
实现内存映射文件的操作,将文件映射到内存中,从而在与文件交互的时候减少磁盘操作。复制了父进程惰性分配的页面都会导致panic,因此需要修改。,或者子进程在fork中调用。如果对惰性分配的页面调用了。系统调用,这里不再赘述。所有的问题都解决了。原创 2023-12-19 21:46:38 · 222 阅读 · 0 评论 -
【mit 6.S081】学习笔记 Lab9 File system
使其在遇到符号链接的时候,可以递归跟随符号链接,直到跟随到非符号链接的 inode 为止或者达到最大跟随深度。系统调用,添加一个系统调用的过程不再赘述,这里只说明。实现二级索引以及释放块,与一级索引相似。原创 2023-12-19 21:46:02 · 209 阅读 · 0 评论 -
【mit 6.S081】学习笔记 Lab8 Lock
这个链表,将空闲物理页本身直接用作链表项,然后连接成一个链表,这样可以不使用额外的空间,在分配的时候,将分配后的物理页从该链表中删除,回收时将该物理页放回链表中。这个链表,而修改不是一个单步操作,所以说,为了保证多线程的正确性,必须加锁,但是加锁势必会导致多线程无法并发的申请内存,降低并发效率。而锁优化大抵是有俩种思路,其一是,资源只在必须共享的时候共享,其二是,尽量缩短在关键区中停留的时间。返回当前的核心编号,但只有在中断关闭时调用它并使用其结果才是安全的。核共享,然后,大锁化小锁,降低锁的粒度。原创 2023-12-19 21:45:14 · 351 阅读 · 0 评论 -
【mit 6.S081】学习笔记 Lab7 Multithreading
另外一个,无论是程序主动 sleep,还是时钟中断,都是通过 trampoline 跳转到内核态 usertrap(保存 trapframe),然后再到达 swtch 保存上下文的。的功能,所以说对照内核中的线程调度机制很有必要,这里的线程感觉更像协程,原因是这里的线程是完全用户态实现的,多个线程也只能运行在一个 CPU 上,并且没有时钟中断来强制执行调度,需要线程函数本身在合适的时候主动 yield 释放 CPU。上锁的粒度会影响程序的效率,所以我将锁的粒度降低到每一个桶一个锁。原创 2023-12-19 21:40:17 · 241 阅读 · 1 评论 -
【mit 6.S081】学习笔记 Lab6 Cow
但是这样对于释放用户内存的物理页面变得更加棘手,所以我们将引入引用计数机制。这是为了确保每个物理页在最后一个PTE对它的引用撤销时被释放,而不是在此之前。将父进程的物理页映射到子进程的,而不是立即分配新页,同时,清除父子进程的写权限并设置COW权限。导致子进程共享页面时,增加页的引用计数;每当任何进程从其页表中删除页面时,减少页的引用计数。使其能能够识别页面错误,当COW页出现页错误时,我们才使用。分配一个新页,并将旧页复制到新页,然后将这个新页添加到。分配页时,将页的引用计数设置为1。原创 2023-12-19 21:38:29 · 300 阅读 · 1 评论 -
【mit 6.S081】学习笔记 Lab5 Network diver
为什么要使用锁,是为了避免竞态条件,在发送数据时,由于多个线程同时访问发送环(TX_ring)中的描述符,倘若没有锁来保护对描述符的访问,可能对引发竞态条件,导致访问失败。主要在中断上下文中执行,而中断上下文是一个特殊的执行环境,它不会被抢占。在中断上下文中执行的代码是原子的,不会被其他中断打断,因此不需要额外的锁来保护。的提示部分已经很详细了,只需要将文字转化为代码即可。网卡对于数据包的传输和接受,其实。接收时不使用锁的原因是,调用。是中断处理函数,所以说。原创 2023-12-19 21:37:32 · 129 阅读 · 1 评论 -
【mit 6.S081】学习笔记 Lab4 Traps
最后,您应该在每次报警计数器关闭后“重新配置”它,以便周期性地调用处理程序。”后崩溃,对于目前来说也是正常的。fp 指向当前栈帧的开始地址,sp 指向当前栈帧的结束地址。(栈从高地址往低地址生长,所以 fp 虽然是帧开始地址,但是地址比 sp 高。在 xv6 中,使用一个页来存储栈,如果 fp 已经到达栈页的上界,则说明已经到达栈底。时间消耗的受计算限制的进程,或者对于那些计算的同时执行某些周期性操作的进程可能很有用。注意栈的生长方向是从高地址到低地址,所以扩张是 -16,而回收是 +16。原创 2023-11-26 18:46:14 · 161 阅读 · 1 评论 -
【mit 6.S081】学习笔记 Lab3 Page tables
RISC-V 的逻辑地址寻址是采用三级页表的形式,9 bit 一级索引找到二级页表,9 bit 二级索引找到三级页表,9 bit 三级索引找到内存页,最低 12 bit 为页内偏移(即一个页 4096 bytes)。):页表里的"value",根据PTE可以找到相关的物理内存页(的起始地址)。虚拟内存页:page,每页有4KB大小,相应的物理内存页存放了相关数据。中,如果用户态调用系统调用,就会切换到内核态,这中间一定是有开销的,至少。,其作用是从一个用户页表地址开始,搜索所有被访问过的页并返回一个。原创 2023-11-14 19:58:43 · 651 阅读 · 1 评论 -
【mit 6.S081】学习笔记 Lab2 System calls
中,空余内存页的存储方式是,将空余页表页本身直接作为链表节点,形成一个空余页的链表,在分配页表时,直接把该链表的根节点所对应的页表分配出去,在回收时,直接把要回收的页作为新的根节点,接在原本的空余页的链表后。这个问题的答案与之后学习的页表知识相关,这是由于内核和用户进程所使用的页表不同,寄存器也不互通,所以说参数是无法通过函数参数传参的形式从用户态直接传到内核态的,而是需要使用一些特定的函数实现这样的功能,即通过。的方法结合进程的页表,才能顺利找到用户态的指针所对于的物理内存地址。这玩意好像是会生成一个。原创 2023-11-13 21:37:28 · 261 阅读 · 0 评论 -
【mit 6.S081】学习笔记 Lab1 Utilities
这个lab只是实现了几个Unix的实用工具,熟悉xv6的使用!fork创建子进程,创建管道,实现父子进程之间的数据传输。工具从标准输入读入数据,将每一行当作参数,加入到传给。通过多进程实现埃氏筛算法,很有意思的一道题目。的程序名和参数后面作为额外参数,然后执行。原创 2023-11-12 21:59:24 · 139 阅读 · 0 评论