page tables [os lab3]
Print a page table
To help you learn about RISC-V page tables, and perhaps to aid future debugging, your first task is to write a function that prints the contents of a page table.
Define a function called vmprint(). It should take a pagetable_t argument, and print that pagetable in the format described below. Insert if(p->pid==1) vmprint(p->pagetable) in exec.c just before the return argc, to print the first process’s page table. You receive full credit for this assignment if you pass the ...
System calls [os lab2]
system call的相关代码
user-space code: user/user.h , user/user.pl
kernel-space code: kernel/syscall.h , kernal/syscall.c
process-related code: kernel/proc.h , kernel/proc.c
先switch git branch到sycall
git fetchgit checkout syscallmake clean
1. System call tracing
In this assignment you will add a system call tracing feature that may help you when debugging later labs. You’ll create a new trace system call that will control tracing. It should take one argument, an integer “mask”, whose bits specify whic ...
启动xv6创建第一个进程
Xv6启动过程
xv6通电后先完成初始化
运行存储在ROM中的boot loader
boot loader将xv6 kernel加载到memory中。kernel被加载到0x80000000处,之所以不加载到0x0处是因为在0x0:0x80000000之间包含了I/O设备。(此时分页硬件被disable了,虚拟地址直接对应物理地址)
在machine mode下,CPU从_entry(kernel/entry.S:6)开始执行xv6。_entry的作用是为C代码的运行指定栈。在start.c中, xv6声明了初始stack的空间stack0。_entry中的代码将地址stack0+4096加载到stack pointer register sp,也就是栈顶的地址。
# qemu -kernel loads the kernel at 0x80000000 # and causes each CPU to jump there. # kernel.ld causes the following code to # be ...
Xv6 and Unix utilities [OS lab1]
MIT Lab1: Xv6 and Unix utilities
Find Some References
MIT 6.828 - 1. Lab 01: Xv6 and Unix utilities
MIT-6.s081-OS lab util Unix utilities_RedemptionC的博客-CSDN博客
MIT6.828实验1 – Lab Utilities
zhayujie/xv6-riscv-fall19
MIT 6.828 Lab 1: Xv6 and Unix utilities * The Real World
6.S081-LAB1 Xv6 and Unix utilities
Boot xv6 (easy)
$ git clone git://g.csail.mit.edu/xv6-labs-2020Cloning into 'xv6-labs-2020'......$ cd xv6-labs-2020$ git checkout utilBranch 'util' set up to track remote bra ...
pipe
File Descriptor–操作系统是怎样操作文件的?
1. 什么是file descriptor
文件描述符是一个small int,它代表了一个内核管理的对象(kernel-managed object),进程可以通过文件描述符对该对象进行读写操作。
进程可能通过如下方法获取文件描述符: 打开文件、目录或设备,创建管道,复制一个已有的描述符。为简单起见,文件描述符指向的对象都被称为是“文件”;文件描述符抽象出来文件、管道和设备的共同点,使它们看起来都像是字节流。
文件描述符从0开始计数。按照惯例,0是标准输入,1是标准输出,2是标准错误。
2. 那怎么通过file descriptor来操作文件呢
如图有三个table: (per-process) file descriptor table, (system-wide) file table, inode table。 通过这三个table, 我们可以就可以通过file descriptor来处理文件了
内核为每个进程维护一个file descriptor table, 它保存了文件描述符并且指向一个file table ...
操作系统接口
Overview
如下图所示是一个计算机系统,最底层有有一些硬件资源,比如: CPU, 内存,磁盘,网卡。
在上层运行一些应用程序,比如一个文本编辑器(VI),一个C编译器(CC), 一个Shell。这些程序都运行在一个空间中:用户空间(user space)。
除了用户空间还存在一个内核空间(kernel space)。kernel对底层管理硬件资源,为上层程序提供了大量的服务。他对用户空间程序(进程),对内存进行分配,进行访问控制…。kernel程序总是第一个被启动的,他也是独一无二的存在。
用户空间又如何与内核空间进行交互呢?这是通过一系列的接口来实现的。通常这通过系统调用 (system call)来实现。
如下图所示,在用户空间中有一个shell程序在运行。如果这个时候得到一条读取文件的命令,shell invoke read 这个system call, 跳转到内核空间,执行该命令,然后将结果返回用户空间。 [这里是这么实现的呢]
一些系统调用
fork
System Call
Description
int fork()
Create a process ...
Miss Status Holding Registers (MSHR)
miss status holding register (MSHR) 主要用来处理non-blocing cache中cache miss的情况
简要介绍
miss status holding register (MSHR) 主要用来处理non-blocing cache中cache miss的情况,因此也被称为miss buffer
这里你可能就会对non-blocking cache感到疑惑了。什么是non-blocking cache呢? (不疑惑的话当我没说, 啊这…)
当我们发出一个memory request, 然后就会在cache中寻找这个地址。如果这个地址不在cache中,那么就是一个cache miss。所谓的blocking cache, 当出现cache miss后, 后续对cache的请求将被阻塞,直到处理完了cache miss的情况。很显然,这样很影响效率。
因此,non-blocking cache出来制止这种 "stop the world"的行为。他允许processer继续处理指令,即使存在cache miss。他很像是 ...
运筹学笔记汇总
将所有运筹学的手写笔记汇总在这
单纯形法 pdf
Linear Programming 的对偶性理论 pdf
对偶单纯性法 pdf
原始对偶算法 pdf
贪心算法 pdf
BinPacking的近似算法 pdf
TSP问题 pdf
线性规划松弛算法 pdf
VMware虚拟机共享本机vpn
设置windows上的vpn为允许其他设备接入
找到windows的IPv4地址。打开cmd, 敲下命令
ipconfig
将虚拟机的网络更改到桥接NAT模式
打开ubuntu的网络设置
设置代理服务器
这时浏览器已经可以上网,但是命令行还不行,还需要另外设置。
open ubuntu terminal,输入如下内容
export http_proxy=...export https_proxy=......
最后,可以使用vpn🌶️
Memory Management
.page__header .header__brand path {
fill: rgba(255, 255, 255, .95);
}
1. 虚拟内存基础
1.1 物理和虚拟寻址
主存[main memory]是一个由M个连续的byte组成的数组。每个byte都有一个物理地址与他对应。比如第1个byte对应0的物理地址,第二个byte对应1的物理地址。
可以使用物理地址访问内存。如图,CPU向主存请求物理地址4为起点的4个bytes。
CPU执行这条加载指令时
会生成一个有效物理地址,通过内存总线,传递给主存
主存取出数据返回给CPU
CPU将数据放在一个寄存器里。
现在计算机都会使用虚拟寻址
CPU生成一个虚拟地址来访问主存
这个虚拟地址在被送到内存之前先转换成适当的物理地址,这个过程叫做地址翻译。需要CPU芯片上的MMU于OS合作
1.2 地址空间
地址空间是以一个非负整数地址的有序集合:{0,1,2,⋯ }\{0,1,2,\cdots\}{0,1,2,⋯},
如果地址空间中的整数是连续的,那么我们说它是一个线性地址空间。
在一个带虚拟内存的 ...