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