XV6 0x7
lab7mutex锁的好处: 锁可以避免更新丢失 使多步操作成为原子操作 锁帮助维护不变量 错误使用锁的问题: 死锁(deadlock) ——改用顺序获取释放锁 模块化(modularity) 性能(performance) ——拆分数据结构 锁实现: 通过硬件实现锁获取的原子性 关闭中断,例如当线程获取锁进入临界区,在临界区产生中断,而中断处理程序也需要获取该,从而产生死锁 _sync_lock_test_and_set 是 GNU Compiler Collection (GCC) 提供的一种原子操作函数 123456789101112acquire:while(_sync_lock_test_and_set(&lk_>locked, 1) != 0) ;在locked原子地写入1,但是返回之前的值,若之前的值等于0(没人拿到过锁),代表该进程成功获得锁,退出循环__sync_synchronize();... ...
XV6 0x6
lab6interrupt 先设置初始化中断,在每个cpu运行进程时启用该cpu的中断。当需要向设备写入或读取数据时,调用函数判断该是否有缓冲区写入数据,如果有,则发生数据;如果没有,则该进程休眠,进行上下文切换,执行其他进程。 cpu接受到中断,由用户模式切换为监督者模式,进入usertrap()函数,判断为哪类中断。跳转到对应中断处理函数。 对于以太网等能以极高频率产生中断的程序(极大的中断开销),通常采用轮询(polling)的方式来处理中断。 Implement copy-on write (hard)太菜了没能搞成实验,搞了很久还是不行,内核编程太痛苦了。有时间把这个补充以下。 //TODO 总结一下原因: 将重复、可明确区分的操作划分为函数操作,方便调试和区分。 增加动手前的思考时间,减少中途的改动。 要有耐心。
XV6 0x5
lab521年后的lab删除了该lab 内存分配 急分配:当进程请求内存时,操作系统立即为其分配内存。 懒分配:当进程请求内存时,操作系统不会立即为其分配内存,而是等待内存被释放后再为其分配。 COPY-ON-WRITE(COW) —FORK 牛叉:当一个进程创建另一个进程的副本时,新进程会开始时共享父进程的内存页。只有在这些页被写入时,才会复制这些页。 Demand page:当进程请求一个不存在的页面时,操作系统会将其加载到内存中。 least-recently-used(LRU):LRU是一种页面替换算法,它根据页面最近被访问的时间来决定哪个页面应该被替换。 PTE_A 的作用:可用于时钟算法 memory-mapped-file:mmap系统调用 Eliminate allocation from sbrk() (easy)老师已经在lecture上讲了,所以完成的比较轻松。 首先我们修改sys_sbrk()函数,只修改sz大小,将内存分配交给中断! 1234567891011uint64sys_sbrk(void){ int...
XV6 0x4
lab4trap步骤(跳转到trampoline):交换 a0 和 sscratch: 使用 csrrw a0, sscratch, a0 指令交换 a0 和 sscratch 的值。这样,a0 现在指向 TRAPFRAME,这是用户空间的 trapframe 地址,而 sscratch 保存了原来的 a0 值(即用户态传递的参数)。 保存用户态寄存器: 将所有用户态寄存器的值保存到 a0 指向的 trapframe 中,以便在处理完陷阱后可以恢复这些寄存器的值。 保存用户态的 a0: 将 sscratch(即原来的 a0)保存到 trapframe 中,以便在返回用户态时可以恢复 a0 的值。 恢复内核态上下文: 从 trapframe 中恢复内核栈指针(sp)、当前 hart 的 id(tp)、usertrap 函数的地址(t0),以及内核页表(satp)。 跳转到 usertrap: 使用 jr t0 跳转到 usertrap()...
贪心
畜栏预定 贪心TODO:畜栏预定、雷达设备 贪心题的要点: 思考、证明通过该方法得到的解是最优解,可用res <= ans,res >= ans ——> res == ans。 acwing905 我们通过重载运算符,设置为通过右端点从小到大排序,获取第一个右端点最大值为max值,若其他线段的左端点小于该max值,则continue。若大于则更新max值,res++。 12345678910111213141516171819202122232425262728293031#include <algorithm>#include <iostream>using namespace std;const int N = 100010;struct st { int lef; int rig; bool operator<(const st &tmp) const { return this->rig < tmp.rig; }} st[N];int...
XV6 0x3
lab3地址空间 trampoline被映射两次用以跳转和跳出内核。 每个cpu拥有各自的kernel...
XV6 0x2
lab2TOPIC: ISOLATION:将资源抽象为服务。我们需要控制应用权限,防止应用程序间的相互影响,定期让应用程序让出cpu… KERNEL/USER MODE:隔离操作系统内核和用户应用程序。 SYSTEM CALL:从用户态转到内核态。通过ECALL指令并传入系统调用号实现。 RISCV模式:用户模式,监督者模式,机器模式。 硬件对隔离的支持 硬件可以通过寄存器的一个位判断当前模式,以允许执行特权指令。 硬件通过虚拟内存限制进程可以访问的内存空间。 宏内核与微内核: 宏内核:将所有操作系统服务都运行在内核模式中。 优点:较好的性能,如应用程序与文件系统交互,只需进入一次内核。 缺点:易产生BUG,且一旦产生bug极可能导致内核崩溃。 微内核:内核模式只提供基础支持,将文件系统等功能作为普通应用程序运行 优点:较少的BUG,某功能崩溃可尝试重启。 缺点:性能欠佳,如应用程序与文件系统交互,应用程序需要先跳转进内核,再从内核跳转进文件系统用户程序。 gdb配置首先将gdb配置输出到~/.gdbinit。 12echo...
XV6 0x1
lab1xv6地址:6.S081 / Fall 2020 (mit.edu) 环境配置:Mit6.s081环境配置踩坑之旅WSL2+VScode_mit6s081-CSDN博客 视频链接:MIT 6.S081 2020 操作系统 [中英文字幕]_哔哩哔哩_bilibili 译文:mit-public-courses-cn-translatio.gitbook.io 参考:课程介绍 · 6.S081 All-In-One (dgs.zone) xv6做的比较快,主要是较难lab参考了dalao得。(PS:主要是自己能力就这,能完成中低难度的lab已经是万幸了) Design is sort of high level structure, and implementation is really about what the code looks like. 设计是一种高层次的结构,而实现则是关于代码真正的样子 OS Purpose: ABSTRACT MULTIPLEX ISOLATION SHARING SECURITY PERFORMANCE RANGE OF...
malloclab
0x1 介绍可以从手册得知,我们需要修改mm.c里面的三个函数mm_malloc、mm_free、mm_realloc来实现堆的相关功能。教师们为我们编写了如此庞大的测试环境,那么我们也要认真完成它。 由于lab自带的版本是每次请求时都执行sbrk系统调用。我们知道,系统调用会是陷入内核,花费大量时间,那么接下来我们要做的就是减少系统调用的次数。 下图为自带版本的测试,可以看到内存利用率并不高 ,并且有部分测试并未通过。 0x2 隐式空闲列表我们进行第一次修改,为其实现一个简单的分配器。 注意事项: 这里的块指针bp指向第一个有效载荷 可以利用宏定义将复杂操作定义为类似函数操作的方法(PS:在预处理期间替换,而函数内联等操作则在编译期替换) sbrk返回值 返回值 描述 (void...
JavaScript学习记录0x1
JavaScript[toc] ECMAScript是 JavaScript 的标准规范。 主要记录下学习记录和javascript相较于C和cpp的差异和特性 跟着现代 JavaScript 教程一起学! 2.1 HelloWorld我们可以直接在html里面嵌入js脚本,也可以引用相对路径的js文件: 1234567891011121314<!DOCTYPE HTML> <!-- HTML5 Document Type --><html> <!-- html文件根元素 --><body> <!-- 直接在html界面嵌入js脚本 --> <script> alert("Randolfluo"); </script> <!-- 引入js脚本 --> <script src =...