mit6.s081 lab4
RISC-V assembly 这个lab是回答一下问题并记录 此处就直接把问题分析和答案打上来了 答案通过chatGPT查验 call.asm中的g、f、main具体的代码 123456789101112131415161718192021222324252627282930313233343536373839404142int g(int x) { 0: 1141 addi sp,sp,-16 2: e422 sd s0,8(sp) 4: 0800 addi s0,sp,16 return x+3;} 6: 250d addiw a0,a0,3 8: 6422 ld s0,8(sp) a: 0141 addi sp,sp,16 c: 8082 ret000000000000000e...
mit6.s081 lecture6
6和7中是陷入的代码相关的问题和页表的复盘 很多涉及的内容已经在前面的文章中描述过 这里不赘述 Lecture6 Trap机制 trap机制是指用户从用户空间切换到内核空间的渠道方法 而触发它的情况包括: 执行系统调用 出现除零错误 等异常 需要进行handle 设备主动触发中断 可能是在需要IO设备交互等的前提下触发 从用户空间陷入 以系统调用为例,从顶层开始描述有: eg: 在user/sleep.c中调用了用户侧的sleep()方法 该方法是通过usys.pl文件生成的usys.S汇编脚本文件 提供了一个调用的汇编接口 12345.global sleepsleep: li a7, SYS_sleep ecall ret 上方就是用户侧sleep()方法的实际代码 这里调用了一个ecall指令 该指令准备好一切进入内核空间的环境: 设置当前为supervisor mode 存原程序计数器PC值到sepc寄存器当中 将程序计数器设置为控制寄存器stvec寄存器当中 同时设置scause寄存器中的值 该寄存器存储中断原因 这里存储的值是8...
mit6.s081 lab3
Speed up system calls 顾名思义 该Lab就是在user / kernel mode之间设定一个共享只读缓存 该缓存是以线程为单位共享的 换言之 只要不影响两空间之间的数据隔离规则 就可以将其值设置在这个只读缓存当中‘ 这里所设置的是pid 内核空间和用户空间之间交互的手段是trampoline和trapframe 前者是将数据由一个态陷入另一个态的逻辑代码 后者则是在这一过程中需要携带的数据结构 在这里需要多加一个字段 类似实现trace的时候一样 关于这个usyscall 已经给出了用户侧ugetpid()调用实例和实际的结构体内容 kernel/proc.c 结构体添加元素 12345// Per-process statestruct proc { ... struct usyscall* usyscall_info; // user / kernel model shared...
mit6.s081 lecture4-5
Lecture5中是TA讲的关于栈帧等比较琐碎的东西 这里搞在一起了 Lecture4-5 页表 & 虚拟内存相关 接上Lecture3中的描述 我们已经知道了强隔离性对于操作系统中进程的独立运行是必须的 如何实现这个强隔离性呢? 使用pagetable是一种非常主流灵活的方法 what 按照页表的模式,整个操作系统需要分页硬件机制所支持 在xv6中 对于操作系统的单个CPU(核) 内核会自己维护一个页表 存储核心数据 可见kernel/main.c中的uvminit()与uvmiinithart() 前者进行了初始化配置,分配内存空间 而后者将配置后的程序与空闲空间进行了映射 整个的工作流中可以大致分为几个部分: pagetable CPU VA MMU SATP MEM PA 系统得到携带参数进来执行调用需求 -> 用户空间将页表基址存储在SATP寄存器 -> 用户空间将其分配在虚拟地址VA -> 内核通过MMU进行虚拟地址VA到物理地址PA间的转换 -> 内核空间根据PA在MEM中执行对应操作 可能会有点不严谨 当然了...
mit6.s081 lab2
Lab2中的主要是完成两个系统调用 分别是trace和sysinfo Trace 作用是查找系统调用时的锚点信息 关键点在于对整个系统调用的调用过程理解清楚 系统调用在内核中的调用流 真正执行sysCall的逻辑在kernel/syscall.c当中。 该文件规定了部分内核 / 用户空间复制使用到的lib方法 系统调用声明 调用宏和方法之间的map映射 真正调用时执行的syscall方法 宏在kernel/syscall.h中规定 系统调用具体实现在kernel/sysproc.c中实现 当系统调用请求到来的时候 会通过trampoline.S中陷入内核 jmp至usertrap()方法中 该方法在kernel/trap.c中 在该方法就会真正调用syscall()方法 执行系统调用 而在用户空间如何跳转到内核空间? 使用kernel/usys.pl文件定义 暴露向外的汇编接口 这个接口是利用了kernel/syscall.h下的宏定义 将映射的方法名称如fork()等与对应的编号1联系起来 在编译的时候 该文件就会编译生成汇编接口文件 外部调用fork()的时候...
mit6.s081 lecture3
Lecture3 别问为什么第一篇就到3了… Lecture1混进OperatingSys了。 Isolation 隔离 稻草人设计 所谓的操作系统是在硬件和程序之间的一层抽象。 假如说没有了操作系统这一层抽象的话,会发生什么? 首先就是上下文切换这一点,虽然说程序本身可以做到类似主动让步让出系统资源这一操作(yield)。但是假如程序在正常的执行过程中出现了类似死循环,或panic等等异常。此时由于没有操作系统的介入(SysCall)。就会导致无法退出,或者说无法recovery。不能强制的实现一般性多应用程序间切换。multiplexing 另外的话,操作系统保证了空间资源等的分配。假如没有操作系统的分配。应用程序之间有可能会使用到同一份物理空间(不是虚拟内存)。此时数据会被覆盖。影响正常运行等结果不必多说。 两者概括为: 内存隔离 multiplexing *在实时操作系统中,应用程序可能会相互信任,所以不会有这些问题。 所以 Unix interface Abstract the hardwares Provide Strong Isolation To...
mit6.s081 lab1
Boot xv6 这个Lab在0中已经提及过 不再赘述 Sleep 第一个实打实的Lab,大致上是过一下整个编写代码的流程,只需要做命令行校验和系统调用就可以了。 123456789101112131415161718192021222324#include "kernel/types.h"#include "kernel/stat.h"#include "user/user.h"int main(int argc, char* argv[]) { int n; if (argc != 2) { fprintf(2, "Please enter a number!\n"); exit(1); } else { n = atoi(argv[1]); if (n != 0) { sleep(n); } else { fprintf(2, "Please...
mit6.s081 init
本人是一个c/c++只懂语法 项目工程化等东西一窍不通的初学者 所以之后的配置或者某些概念可能会写的比较琐碎基础 不足之处请多指教谢谢! 0.配置Vs Code环境 此处使用的是WSL 12$ sudo apt-get update && sudo apt-get upgrade$ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu 安装对应的依赖包之后,这里是使用了xv6-labs-2021的基础上进行修改 1$ git clone git://g.csail.mit.edu/xv6-labs-2021 克隆下来之后,可在命令行中将xv6通过qemu先运行起来,即make qemu 正常运行的话会如下 xv6_init 可执行ls cat等基本命令来测试 程序可使用ctrl+x,a来退出 也可以通过lsof | grep xv6查看进程pid然后退出(丑) 回归正题...
MySQL
MySQL中一行记录是怎么存储的?MYSQL中行之间的存储通过链表进行连接 此部分记录多头信息,包括: delete_mask:标识数据的逻辑删除,若逻辑删除则设1,否则0 next_record:类似链表的存储格式,存储的位置介于记录头信息和真实数据之间的位置。 record_type:标识当前记录的类型。TODO 没明白 在头信息的右边是真实的字段值,左边则是null值列表与 变长字段所占用的真实字节数(当使用到变长字段时 需要先知道他真实的占用大小才能进行使用) 何为null值列表?数据库中的字段设置为NULL的话,就会创建对应的null值列表。用于记录这些值中,哪些字段的值是真的null,如果是null则设为1,非null设为0。并且在mysql中,是以字节为单位存储这些列的信息的。也就是说,若NULL字段少于8,会补齐前置0至8(单字节容量)。若超过了8个字段,则会使用两个字节进行存储。 那么这个NULL值列表是必须的吗?否,如果所有字段都是NOT...
autoMQ
两面项目面:time:...