MIT 6.S081
文章平均质量分 85
差不太多先生
这个作者很懒,什么都没留下…
展开
-
MIT 6.S081操作系统之 多进程和多线程
每一个CPU核在一个时间只会做一件事情,每个CPU核在一个时间只会运行一个线程,它要么是运行用户进程的线程,要么是运行内核线程,要么是运行这个CPU核对应的调度器线程。类似的每一个线程要么是只运行在一个CPU核上,要么它的状态被保存在context中。线程永远不会运行在多个CPU核上,线程要么运行在一个CPU核上,要么就没有运行。1.从一个用户进程切换到另一个用户进程,都需要从第一个用户进程接入到内核中,保存用户进程的状态并运行第一个用户进程的内核线程。RUNNING,线程当前正在某个CPU上运行。原创 2023-03-10 11:55:28 · 56 阅读 · 0 评论 -
Page fault(异常)
假设现在是子进程在执行store指令,那么我们会分配一个新的物理内存page,然后将page fault相关的物理内存page拷贝到新分配的物理内存page中,并将新分配的物理内存page映射到子进程。这里使用自旋锁是考虑到这种情况:进程P1和P2共用内存M,M引用计数为2,此时CPU1要执行fork产生P1的子进程,CPU2要终止P2,那么假设两个CPU同时读取引用计数为2,执行完成后CPU1中保存的引用计数为3,CPU2保存的计数为1,那么后赋值的语句会覆盖掉先赋值的语句,从而产生错误。原创 2023-03-03 18:43:32 · 1618 阅读 · 0 评论 -
Lab4 Trap(内核状态切换)
内核完成它的工作之后,代码执行会返回到用户空间,继续执行ecall之后的指令,也就是ret,最终返回到原c程序中。首先,我们需要保存32个用户寄存器。在函数中,可以通过查看a0寄存器,这是第一个参数,a1是第二个参数,a2是第三个参数等,获得在用户空间调用write时传入的参数。程序计数器也需要在某个地方保存,它几乎跟一个用户寄存器的地位是一样的,我们需要能够在用户程序运行中断的位置继续执行用户程序。我们需要保存32个用户寄存器的内容,这样当我们想要恢复用户代码执行时,我们才能恢复这些寄存器的内容。原创 2023-03-03 18:39:51 · 136 阅读 · 0 评论 -
Lab3 Page tables相关知识和实验
为什么需要虚拟地址?隔离性。将用户程序之间,用户程序和内核之间进行内存隔离。防止一个程序错误的操作了另一个程序的内存。通过PTE的flags位,可为系统提供更多的功能。原创 2023-03-03 18:39:56 · 107 阅读 · 0 评论 -
MIT 6.S081 Lab1系统调用
exec将当前进程的内存和寄存器替换为一个新的程序(/init),当kernel执行完毕exec指定的程序后,回到/init进程。函数实现逻辑为:首先需要获取系统调用的参数,也就是从用户态传入的参数mask,然后设置当前进程的syscall_trace为该参数(需要在进程结构体中添加该项),同时为了能够保证真正地trace指定的系统调用,那么就不仅仅在该进程,同时也需要相关所有的子进程也传递该参数,就需要在fork.c函数中增加一行赋值语句。添加一个系统调用,返回空闲的内存、以及已创建的进程数量。原创 2023-03-03 18:35:58 · 125 阅读 · 0 评论 -
MIT 6.S081/828 环境搭建/GDB调试+VScode
按照官方文档下载相关软件。最新xv6源码使用此架构qemu-system-riscv64。直接make qemu即可成功我们来看传给QEMU的几个参数:-kernel:这里传递的是内核文件(kernel目录下的kernel文件),这是将在QEMU中运行的程序文件。-m:这里传递的是RISC-V虚拟机将会使用的内存数量-smp:这里传递的是虚拟机可以使用的CPU核数-drive:传递的是虚拟机使用的磁盘驱动,这里传入的是fs.img文件其他架构:执行make qemu会报错找不到qemu。原创 2023-03-03 18:33:42 · 1219 阅读 · 0 评论