首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MIT_6.s081_Lab1:Xv6 and Unix utilities

/kernel/kernel载入符号表,然后target remote loaclhost:26000即可: Lab1_1:Boot xv6 运行并安全退出xv6系统: 运行方法很简单:cd进xv6文件夹里面...(中文版xv6 书籍) 查看user/中其他一些程序 (例如,user/echo.c、user/grep.c和user/rm.c)以了解如何获取传递给程序命令行参数。...Lab1_3 pingpong 编写一个程序,使用 UNIX 系统调用在两个进程之间通过一对管道“乒乓”一个字节,每个管道一个。...,河流分成了两,这两都从分叉口开始继续往下流.在这里分叉口就像fork()调用,调用生成了两个分叉,两个分叉都从fork()调用结束后继续往下走....Lab1_5 find 编写一个简单版本 UNIX 查找程序:查找目录树中具有特定名称所有文件。给定对应文件名以及文件名在目录,找到文件名位置.

73220

MIT 6.S081 (BOOK-RISCV-REV1)教材第一章内容 --- 操作系统接口

另一方面,我们可能倾向于为应用程序提供许多复杂特性。 解决这个问题诀窍在于设计接口时,依赖一些可结合机制,以此来提供更好通用性。 本书使用单一操作系统作为具体例子来说明操作系统概念。...---- xv6shell使用上述调用为用户运行程序。shell主要结构很简单,请参见main(*user/sh.c:145*)。...因为sh.c目标是尽可能简单,所以它不会试图避免创建内部进程。...Xv6与POSIX不兼容: 它缺少许多系统调用(包括lseek等基本系统调用),并且它提供许多系统调用与标准不同。 我们xv6主要目标是简单明了,同时提供一个简单类unix系统调用接口。...为了运行基本Unix程序,有些人扩展了xv6,增加了一些系统调用和一个简单c库。 然而,现代内核比xv6提供了更多系统调用和更多种类内核服务。

21120
您找到你想要的搜索结果了吗?
是的
没有找到

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

所以,现代类Unix操作系统有许多种shell可以选择,每种shell都有其自身用户界面与脚本特性。XV6shell 是Unix Bourne shell一个简单实现。...如果wc指向一个管道写端口,那么wc就永远看不到eof了。 xv6 shell使用了与上面代码类似的方法,实现了如grep fork sh.c | wc -l这样管道(在8450行)。...管道右端可能也是一个带有管道命令(例如 a|b|c),它fork两个新子进程(一个b,一个c)。...文件系统 xv6 文件系统提供数据文件与目录,文件就是一个简单字节数组,目录包含了指向文件或其他目录引用。Xv6把目录作为特殊文件来处理。目录构成了一棵树,树根为一个称为root特殊目录。...路径a/b/c指向了一个名为c文件或目录,c在文件目录b下,而目录b又处于目录a下,a又是处于root目录之下。

58060

MIT 6.S081 教材第七章内容 -- 调度 --下

尽管上下文切换思想很简单,但它实现是xv6中最不透明代码之一。 第二,如何以对用户进程透明方式强制切换?Xv6使用标准技术,通过定时器中断驱动上下文切换。...需要小心避免导致唤醒通知丢失竞争。 Xv6试图尽可能简单地解决这些问题,但结果代码很复杂。...因此,如果要打印xv6切换线程处行号,将观察到以下简单模式:(kernel/proc.c:475),(kernel/proc.c:509),(kernel/proc.c:475),(kernel/proc.c...睡眠和唤醒是一种简单有效同步方法,但还有很多其他方法。所有这些问题第一个挑战是避免我们在本章开头看到“丢失唤醒”问题。...proc结构体,而不是allocproc中线性时间搜索;xv6使用线性扫描是为了简单起见。

19530

MIT6.828实验1 —— Lab Utilities

sleep sleep功能为使进程睡眠若干个时钟周期(xv6中一个tick为100ms),首先创建user/sleep.c源文件,引入user.h头文件,系统调用和工具函数都定义在该文件里。...= 0): write n to right // 不能被p整除则向右输出 } 还需要注意两点: 文件描述符溢出: xv6限制fd范围为0~15,而每次pipe()都会创建两个新...这里使用重定向到标准I/O方式来避免生成新fd,首先close()关闭标准I/Ofd,然后使用dup()复制所需管道fd(会自动复制到序号最小fd,即关闭标准I/O),随后对pipe两侧fd...xv6系统调用流程 Lab中对system call使用很简单,看起来和普通函数调用并没有什么区别,但实际上调用流程是较为复杂。我们很容易产生一些疑问:系统调用整个生命周期具体是什么样?...3.内核态执行 完成进程切换后,调用trap.c/usertrap(),接着进入syscall.c/syscall(),在该方法中根据system call number拿到数组中函数指针,执行系统调用函数

2.3K00

xv6(20) 常用命令实现

常用命令实现 本节来看看在 $xv6$ 里面一些常见命令是如何实现,它们都是用户程序,封装系统调用而成,大多数都很简单一眼过去就能懂那种,来看: echo $echo$ 命令将紧跟其后参数当作字符串打印出来...来看 $xv6$ 里实现 首先是两个匹配函数 int matchhere(char* re, char* text); int matchstar(int c, char* re, char* text...0 次情况,后续再次执行循环体的话就是匹配多次情况 上述就是匹配主要函数,稍微有些困难地方可能就是 * 元字符,找几个简单例子模拟一下应该也多大问题,到此还有个 ^ 匹配开头没有处理,来看:...上述就是 $xv6$ 中一些命令实现,很简单,大多数就是调用现成系统调用就能完成工作,配上详细注释应该是一眼就能懂什么意思。...稍微困难些就是 $grep$ 命令,涉及到递归思想是稍微要困难点,多看几遍问题应该也不大 好了本节就这样吧,有什么问题还请批评指正,也欢迎大家来同我讨论交流学习进步。

32110

xv6(13) 文件系统:文件描述符&系统调用

属性字段辨析 这里来解决前文遗留一些问题,在前文 inode部分 我们聊过 $inode$ 一些属性字段,当时有些地方只是简单提了几句,说是后面详述。...这里简单再过一下系统调用,$xv6$ 系统调用使用 INT 64 指令来实现,触发一个 $64$ 号中断陷入内核,根据向量号 $64$ 去获取执行中断服务程序。.../b/c/.$ 之类,而 $Linux$ 下是无法 $unlink$ 一个目录。...如果使用绝对路径,那么这个软链接放在任何地方,只要源文件没问题,那么通过软链接操作文件是没有问题。...我做了一个简单测试: int main(){ int fd; fd = open("unlink_test.txt", O_RDWR|O_CREAT); //打开创建一个文件

29110

xv6(6) 系统调用

系统调用通俗讲就是是用户态下程序托内核办事,既然是托人办事那得告诉人家你要办什么事对吧。这个告诉人家具体要办什么事就是要给内核传递系统调用号,问题是怎么传呢?...函数名就相当于一个地址,name: 后面的代码就是这个函数具体要做事,就像 c 语言编写函数时函数体,只不过这里是用汇编写而已。 所以这个函数做了什么事?...这个被调用函数就是用户接口,举个例子如果调用 $write(fd, buf, size)$,则在这之前一定会将参数 $size, buf, fd$ 按照这个顺序压栈,再 $call$ 调用函数,只是在...$c$ 语言中这个过程可能看起来不是那么真切,如果是用汇编来写,或者查看编译之后程序,会有下面的大致过程: push size push buf push fd call write 在 call...,也就是用户接口 $write(fd, buf, size)$ $buf$ 地址值,并将其赋给 $p$。

27410

xv6(18) 控制台输入输出

xv6 在这方面实现比较简单,只实现了字符转化,一些功能控制键,我们来看看。...$ 个字符,光标的当前位置加上当先行剩余可容纳字符数就是将光标移动到下一行行首了,简单一个数学加减法,应该没什么问题。...} 这一个 $if$ 语句块来简单粗暴处理滚屏操作,一屏最多使用 $25$ 行,$xv6$ 里面当要写第 24 行时候就开始执行滚屏操作,最后一行没有使用。...,这里就直接来看用户态下如何实现 $printf$ 函数,首先打印单个字符函数: static void putc(int fd, char c) { write(fd, &c, 1); } $putc...state = '%'; //记录状态为% } else { //如果当前字符不是% putc(fd, c); //调用putc向fd指向文件写字符c

23410

MIT6.828实验2 —— Lab Shell

;对系统调用异常进行处理 xv6中提供有sh.c实现,除了重定向和管道,还对括号、列表命令、后台命令等做了支持,且整体设计较为复杂。...所以我们无需过多参考已有代码,可以选择简单思路来满足需求,在完成后再去阅读xv6shell实现。 Shell本质上是一个用户程序,在用户和操作系统间建立连接。...,基于 gets() 函数来接收标准输入,直接参考sh.c即可。...xv6shell实现 xv6shell实现在user/sh.c中,大致思路和我们nsh相似,都是实现了对用户命令循环读取、解析、执行,不过支持命令类型更多且涉及更复杂。...**1.主体逻辑** sh.c将命令解析和命令执行独立开来,首先递归地构造出结构化命令树,然后又递归地去遍历树中命令并执行。

1.7K30

MIT_6.s081_Lab

/kernel/kernel载入符号表,然后target remote loaclhost:26000即可: Lab1_1:Boot xv6 运行并安全退出xv6系统: 运行方法很简单:cd进xv6文件夹里面...,河流分成了两,这两都从分叉口开始继续往下流.在这里分叉口就像fork()调用,调用生成了两个分叉,两个分叉都从fork()调用结束后继续往下走....文件notxv6 / ph.c包含一个简单哈希表,该哈希表从单个线程使用时是正确,但从多个线程使用时则是错误。...kernel/net.c和kernel/net.h包含了一个简单包含IP、UDP、ARP协议网络栈。这些文件页包含了一个灵活数据结构来持有数据包,叫做mbuf。...一旦你完成了 E1000 驱动程序工作,kernel/net.c 就会处理这个问题

1.1K10

MIT 6.S081 Lab Five -- Lazy Page Allocation

Attention: 在开始编码之前,请阅读xv6手册第4章(特别是4.6),以及可能要修改相关文件: kernel/trap.c kernel/vm.c kernel/sysproc.c...---- 代码解析 这个实验很简单,就仅仅改动sys_sbrk()函数即可,将实际分配内存函数删除,而仅仅改变进程sz属性 uint64 sys_sbrk(void) { int addr;...: page table 0x0000000087f55000 ..0: pte 0x0000000021fd3c01 pa 0x0000000087f4f000 .. ..0: pte 0x0000000021fd4001...pa 0x0000000087f52000 .. .. ..510: pte 0x0000000021fd58c7 pa 0x0000000087f56000 .. .. ..511: pte 0x0000000020001c4b...所以,对于uvmunmap中第一个continue而言,主要解决问题是一二级页表中存在Lazy Alloctionpte还未建立映射关系,所以walk函数会返回0: 对于第二个continue

19240

xv6(14) 文件系统:创建

/数据区大小 int freeblock = nmeta; //数据区起始块号 上述一些元信息计算应该还是很简单,不多解释,注意文件系统基本单位是块,块数就是大小,块号就是位置即可。...y; a[0] = x; a[1] = x >> 8; a[2] = x >> 16; a[3] = x >> 24; return y; } 运用移位运算来转化大小端,应该还是很简单...这类函数从哪开始写,写到哪儿,一次性能写多少,变量有些多,有点扰人,不过逻辑不复杂,耐心点应该没什么问题。...(fd); //关闭该参数文件 } 这部分将主机上编译好可执行文件写进磁盘文件根目录,首先为每个可执行文件比如说 $cat$ 分配一个 $inode$,然后在根目录下安装目录项,最后将主机上...好了本节就这样吧,有什么问题还请批评指正,也欢迎大家来同我讨论交流学习进步。

22010

xv6(19) SHELL交互程序

本文主要通过 $xv6$ 来看看如何实现一个简单 $shell$,$shell$ 实现分为两个主要步骤,一解析输入命令字符串,二执行命令。...fd[0] = fd0; //赋值给参数 fd[1] = fd1; return 0; //返回0表正确 } 如果操作都都没出问题的话就将分配文件描述符赋给参数,因为是传指针...下面讲述实际 $shell$ 程序,$xv6$ $shell$ 是 $Bourne\ shell$ 简单实现,而 $Bourne\ Shell$ 就是 $bash$ 前身。...另外管道是属于内核一片内存区域,$xv6$ 机制很简单,回收管道资源就是依靠 $close$ 系统调用,它会调用 $fileclose$ 来减少文件结构体引用数,当文件结构体引用数减少到 0 时候就会调用...$xv6$ $shell$ 退出之后又会重建,因为在 $init$ 进程中: /*******init.c*******/ int main(){ for(;;){ /******略******

28710

MIT 6.S081 教材第八章内容 -- File systems -- 03

本课程前置知识主要涉及: C语言(建议阅读C程序语言设计—第二版) RISC-V汇编 推荐阅读: 程序员自我修养-装载,链接与库 前面两节,我们介绍了xv6 文件系统教材上相关小节说明,从本节开始...在XV6中,使用数据结构非常简单,因为XV6是专门为教学目的创建。真实文件系统通常会更加复杂。但是它们都是磁盘上保存数据结构,我们在今天课程会重点看这部分。 最后一个有趣的话题是性能。...XV6这里极其简单,基本是按照最早Uinx实现方式来,不过你可以实现更复杂结构。...出于简单和更容易解释目的,XV6使用了这里这种非常简单数据结构。...ialloc函数位于fs.c文件中。 以上就是ialloc函数,与XV6大部分函数一样,它很简单,但是又不是很高效。

18230

MIT 6.S081 教材第七章内容 -- 调度 -- 中

实际上XV6允许在执行内核代码时触发中断,如果你查看trap.c代码你可以发现,如果XV6正在执行内核代码时发生了定时器中断,中断处理程序会调用yield函数并出让CPU。...在我回到XV6代码之前,让我演示一下如何在UART驱动中使用刚刚介绍sleep和wakeup函数。这基本上是重复前一节内容,不过这次我们使用刚刚介绍稍微简单接口。 首先是定义done标志位。...所以我们需要在两个函数中加锁来避免对于done标志位和硬件竞争访问。 现在问题是,我们该在哪个位置加锁?在中断处理程序中较为简单,我们在最开始加锁,在最后解锁。...当它还在执行代码,它就不能释放正在使用资源。所以我们需要一种方法让线程能释放最后几个对于运行代码来说关键资源。 记住这两个问题XV6有两个函数与关闭线程进程相关。.... // 关闭当前进程打开所有文件 for(int fd = 0; fd < NOFILE; fd++){ if(p->ofile[fd]){ struct file *f

19610

从零实现操作系统-Lab 1: Unix utilities

,使进程睡眠若干个滴答周期(滴答是 xv6 内核定义时间概念,即来自定时器芯片两次中断之间时间。)。...效果: $ make qemu ... init: starting sh $ pingpong 4: received ping 3: received pong $ 2.2 分析 要解决这个问题,...下面看下,xv6 book中对管道定义。 管道是一个小内核缓冲区,它以文件描述符对形式提供给进程,一个用于写操作,一个用于读操作。从管道一端写数据可以从管道另一端读取。...将 32 位int写入管道是最简单,而不是使用格式化 ASCII I/O。...exit(0); } for(i=1; i<argc; i++) ls(argv[i]); //ls 和我们熟知linuxls是不太相同xv6ls是可以接受多个目录作为参数

1.1K20
领券