mit6.s081 lab1 Xv6 and Unix utilities

这篇博客详细介绍了MIT6.S081实验1的内容,包括Xv6操作系统的系统调用,如fork、wait、exec,以及I/O和文件描述符的概念。此外,还涵盖了mini shell的工作流程、管道、文件系统操作如chdir、mkdir、mknod。接着,博主分享了如何实现xv6中的sleep程序、ping-pong通信、并发素数筛算法和文件查找工具find,以及xargs命令的原理和实现方法。
chapter 1
system call

1.1 Process and memory

  • int fork()
    创建一个进程,父进程返回子进程的pid,子进程返回0
  • int wait(int *status)
    status获取子进程exit返回的状态,wait返回值为exit的子进程的pid。如果调用wait()的进程有子进程,那么等待一个退出的子进程,如果没有子进程直接返回-1。
  • int exec(char *file, char *argv[])
    加载一个二进制文件并覆盖当前程序的进程内存,二进制文件的格式为ELF,file为二进制文件的地址,argv为程序的执行参数
    mini shell(位于user/sh.c)执行流程
    1.fork创建子进程
    2.子进程exec执行二进制文件
    3.父进程wait等待子进程exit

1.2 I/O and File descriptors
fd 0 - standard input
fd 1 - standard output
fd 2 - standard error

  • read(fd ,buf, n)
    从fd的当前offset读取n bytes并拷贝到buf中,返回读取到的内容长度,当读取完毕时返回值为0
  • write(fd, buf, n)
    从buf中写入b bytes内容到fd中,文件offset的处理与read相同,返回写入内容的长度
  • close(fd)
    释放fd,使得该fd重新可用,新分配的fd总是该进程中未使用的最小fd
  • fd = dup(1)
    复制一个fd,返回值为新的fd,两个fd共享一个文件,当调用fork和dup时会出现两个fd共享一个文件偏移量的情况,即使通过open打开相同文件也不会出现共享文件偏移量的现象

1.3 Pipes
pipe创建一个管道,返回两个fd,其中一个用于写入,另外一个用于读取,当调用read读取管道中的内容时,如果管道中没有数据,那么会等待数据写入管道或者写入端fd被close,当写入端fd被关闭后,read返回0

1.4 File system

  • chdir(path)
    改变当前路径
  • mkdir(path)
    创建一个新目录
  • mknod(path, marjor_dev_num, minor_dev_num)
    创建一个设备文件,设定最大设备号和最小设备号
  • 每个文件对应一个inode,inode相当于文件的metadata,inode中记录了文件的类型(文件或者目录),文件的长度,文件在磁盘上的位置以及文件的链接数量。通过fstat可以获取一个文件对应的inode信息,通过unlink可以释放掉对应的链接,当一个inode中的链接数量为0时inode以及对应的文件就会被删除掉

cat program原理
1.从fd 0读取内容
2.将读取到的内容写入fd 1

Lab1
启动xv6
make qemu
sleep

实现xv6中的sleep程序,sleep可以根据用户设置的停止的ticks来暂停(tick在xv6 kernel中被定义,即一个时间片的时间),需要在文件user/sleep.c中实现

MIT 6.S081 是麻省理工学院开设的一门关于操作系统的课程,课程全称为 **MIT 6.S081: Operating System Engineering**。该课程以实践为导向,通过让学生从零开始逐步构建一个简单的类 Unix 操作系统内核(基于 RISC-V 架构),深入理解操作系统的核心原理和实现机制。 课程内容涵盖线程、调度、虚拟内存、文件系统、系统调用、中断、设备驱动、同步机制等操作系统关键主题。课程材料公开,包括讲义、实验(labs)、视频讲座和源代码,非常适合自学。 ### 课程资源获取方式 1. **官方网站** MIT OpenCourseWare 提供了完整的课程材料,包括实验指导、源代码、讲义和部分视频讲座。 - 官网地址:[https://pdos.csail.mit.edu/6.828/2020/index.html](https://pdos.csail.mit.edu/6.828/2020/index.html) (注意:6.S0816.828 的新编号,内容基本一致) 2. **XV6 操作系统源码** 课程使用 xv6 作为教学操作系统,它是 Unix V6 的简化版,使用 C 语言编写,适合教学和学习。 - 源码地址:[https://github.com/mit-pdos/xv6-riscv](https://github.com/mit-pdos/xv6-riscv) 3. **实验(Labs)** 课程实验包括: - **Lab 1: Xv6 and Unix utilities** - **Lab 2: System calls** - **Lab 3: Page tables** - **Lab 4: Traps** - **Lab 5: Threads** - **Lab 6: Locking** - **Lab 7: File system** - **Project: Networking (optional)** 每个实验都要求修改 xv6 源码以实现特定功能,例如添加系统调用、实现线程调度、实现文件系统操作等。 4. **社区与讨论区** - **GitHub 项目**:许多学生将他们的实验成果上传到 GitHub,可以参考他们的实现思路和代码。 - **Reddit 和 Stack Overflow**:在 r/mit、r/operatingsystems 和 Stack Overflow 上可以找到相关讨论和问题解答。 - **知乎、优快云 等中文社区**:一些中文用户也分享了他们对 MIT 6.S081 的学习笔记和实验解析。 5. **学习建议** - 熟悉 C 语言和汇编基础。 - 掌握基本的数据结构(如链表、队列、树等)。 - 理解计算机体系结构(特别是 RISC-V)。 - 有操作系统基础理论知识(如进程、内存管理、文件系统等)。 ### 示例代码:添加系统调用 以下是一个简单的系统调用示例,用于在 xv6 中添加一个新的系统调用 `sys_helloworld`: ```c // user/user.h int helloworld(void); // user/usys.pl entry("helloworld"); // kernel/syscall.h #define SYS_helloworld 22 // kernel/syscall.c extern uint64 sys_helloworld(void); // kernel/sysproc.c uint64 sys_helloworld(void) { printf("Hello, world from kernel!\n"); return 0; } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值