自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 MIT6S.081 Lab1:Unix utilities

This lab will familiarize you with xv6 and its system calls.实现几个unix实用工具,熟悉系统调用。主要考虑如何把管道符 | 前面的指令得到的标准输入(可能有多行)放到xargs后的命令参数argv[1]所代表文件的参数数组中;

2023-07-13 20:26:44 112

原创 MIT6.S081 Lab2:System calls

3.有了系统调用号后,就可以根据系统调用函数指针数组uint64 (*syscall[])(void) (kernel/syscall.c中),查找到系统调用的实现函数sys_trace() (kernel/sysproc.c) ,到这里系统调用一般完成。内核的系统调用实现需要找到用户代码传递的参数,因为用户代码调用系统调用,实际上是调用它的包装函数,参数首先会存放在寄存器中,这是C语言存放参数的惯例位置。通过用户调用exec系统调用的例子,理解系统调用的过程很重要!)内核实现,主要内容获取调用参数。

2023-07-13 20:26:09 120 1

原创 MIT6.S081 Lab4:traps

打印各级函数调用的返回地址,编译器用栈帧指针指向一个栈帧,栈帧中保存着caller func的栈帧指针。%x是打印十六进制,0x00646c72小端存储为72-6c-64-00,对照ASCII码表,72:r 6c:l 64:d 00:充当字符串结尾标识。倒数到小于等于 0 的时候,如果没有正在处理的时钟,则尝试触发时钟,将原本的程序流保存起来(在 xv6 中,使用一个页来存储栈,如果 fp 已经到达栈页的上界,则说明已经到达栈底。这样,在每次时钟中断的时候,如果进程有已经设置的时钟(

2023-07-13 20:25:38 96 1

原创 MIT6.S081 Lab3:Page tables

Xv6对于用户地址空间使用从零开始的虚拟地址,幸运的是,内核的内存从较高的地址开始。在上一个实验中,已经使得每一个进程都拥有独立的内核态页表了,这个实验的目标是,在进程的内核态页表中维护一个用户态页表映射的副本,这样使得内核态也可以对用户态传进来的指针(逻辑地址)进行解引用。这样做相比原来 copyin 的实现的优势是,原来的 copyin 是通过软件模拟访问页表的过程获取物理地址的,而在内核页表内维护映射副本的话,可以利用 CPU 的硬件寻址功能进行寻址,效率更高并且可以受快表加速。

2023-07-13 20:24:53 121 1

原创 MIT6.S081 Lab5:Xv6 lazy page allocation

在sbrk()的具体实现函数sys_sbrk()中只增加(或者减少)进程内存大小,但不实际分配内存(不调用growproc()),下面的代码考虑到了sbrk参数为负的情况。3.由于懒分配的页,在刚分配的时候是没有对应的映射的,所以要把一些原本在遇到无映射地址时会 panic 的函数的行为改为直接忽略这样的地址。在访问到这一部分内存的时候才进行实际的物理内存分配。由于这里可能会访问到懒分配但是还没实际分配的页,所以要加一个检测,确保 copy 之前,用户态地址对应的页都有被实际分配和映射。

2023-07-13 20:24:05 164 1

原创 MIT6.S081 Lab7:Multithreading

实现在用户态线程库切换线程;用多线程来为程序提速;实现一个同步屏障。

2023-07-13 20:23:04 86 1

原创 MIT6.S081:Lab9 File system

参考上图,原xv6inode 结构中,用于索引数据块的包括直接块(addrs[]数组前NDIRECT的数直接就是数据块地址)和间接块(只是一级索引,addrs[NDIRECT]一项记录间接块的地址,间接块中才直接存储着数据块的地址),由于没有用到更高级索引,所以这限制了能索引的数据块个数,所以现在考虑增加二级索引,来扩大能够支持的文件大小。2.修改bmap()函数(用来获取inode中第bn个块的块号addr),和itruc()函数(释放该inode所使用的所有数据块)。让其能够识别二级索引。

2023-07-13 20:21:32 203 1

原创 MIT6.S081 Lab11:Networking

e1000_recv()函数必须扫描rx ring并且将新的packet的mbuf递交到网络栈(调用net_rx())。然后需要分配一个新mbuf并且将它的信息记录在描述数组(rx_ring)项中,因此当E1000到达rx ring中的该点时,它将会找到一个未填充的buffer,用来DMA 一个新的packet。1.对于发送函数,当网络栈需要发送packet,它调用e1000_transmit(),使用mbuf(该函数的参数)中持有的待发送的packet。

2023-07-13 20:19:58 86 1

原创 C中内联汇编

内联汇编是在C中直接使用汇编语句进行编程,使程序可以在C中实现C语言不能完成的工作。input(C->asm) 用于定义输入的参数,可以使变量和立即数。asm code 填写汇编代码,指令 + \n\t用双引号引上。output(asm->C)用于定义输出的参数,通常只能是变量。asm或者_asm_开头,括号内容写汇编指令。

2023-06-18 21:14:44 143 1

原创 C/C++不能在函数中返回局部变量的讨论

我们知道,函数中创建的局部变量是保存在栈区的,函数执行完毕后,对应空间内的变量会自动销毁,所以是不能直接返回局部变量的。总结:vector与动态数组性质相同,具体数据存放堆区,变量名存放在栈区,变量名存放的是堆区的首地址。这是由于vector并不存放在栈区,而是存放在堆区。所以虽然在函数内创建,但都不能算是个局部变量。但是在C++中,为何又能在函数中返回看似是局部变量的vector呢?

2023-04-10 15:35:38 272

原创 C/C++:qsort和sort函数

二者都是基于快速排序算法,使用上有些区别。

2023-04-06 22:19:40 258

原创 C语言static关键字

局部作用域,即当定义它的函数结束的时候,作用域随之结束,不能被访问,说明只能在定义它的函数中使用。我们知道,一个在file1.c中的普通函数是可以在file2.c中调用的(先引入包含该函数声明的头文件),但静态函数的作用域仅局限于本文件,不能再被其他文件调用。一般我们认为函数外的变量为全局变量,全局变量的定义就是具有文件作用域的变量,即文件中都可见。:处于静态区,用 static修饰函数中的变量后,变量的存储位置就由原来的栈改为静态存储区。同静态局部变量一样,都存储在静态区。

2023-03-22 09:30:30 65

原创 二维数组与指针

pz2是指向int的指针,zippo[0](一维数组)是指向zippo[0][0](是int类型)的指针,指针类型相同。pz2是指向int的二级指针,他俩类型不同,无法赋值;pz1是含有2个int元素数组的指针,可以赋值;对于一维数组arr,数组中元素是int类型,数组名arr指向arr[0]对于二维数组zippo,数组中元素是含有2个int元素的。(1)数组名是数组首元素的地址!,zippo是指向数组的指针。(2)指针赋值必须类型兼容。

2023-03-21 21:30:12 32

原创 【无标题】

在做力扣79.单词搜索时,遇到了问题,记录如下:如果注释掉语句1,代码将无法通过所有示例,不太理解为什么。

2023-03-21 20:56:30 32

原创 关于指针结构体的初始化

关于结构体指针来初始化的小坑

2022-11-09 08:25:47 5117 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除