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命令的原理和实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值