实验2:系统调用
Jacksing

上一节介绍了系统调用的相关细节之后,实验二的代码实现起来其实并不难。实验二的代码可以在 lab2 中查看到。

trace

对于这个系统调用,每次系统调用都会产生一次额外的判断,看起来有点浪费资源了。而且每个进程都会携带一个 mask,大部分情况下空间也浪费了。不知道 Linux 是怎么实现的。

为了实现父子进程都会被 trace 追踪到,就需要修改一下 fork,从这也可以了解到 fork 的一些细节。感觉有意思的主要是两点。

  • 创建子进程的时候,会将子进程的 a0 寄存器直接设置为 0,这也是为什么父子进程的返回值会不同的原因。
  • 子进程的创建就是一个简单的拷贝,所以父子进程的一切都会保持一致,这里可以做一个 Copy-on-write 的优化,好像到课程后面会涉及到。

sysinfo

这个系统调用就比较好玩,从这也了解了一些好玩的东西。

进程

可以发现在 kernel/proc.c 设置了一个 64 个元素的 proc 数组,这个数组就是 Xv6 的 process table。也就是说,Xv6 最多能同时运行 64 个进程。process table 也是一个很大的主题,这个后续的课应该会讲到,暂时不用管。

从这可以联系到 Linux 和 Windows。Linux 的最大进程数可以在 /proc/sys/kernel/pid_max 这个文件中查看到,32 位系统最大进程数为 32768,64 位为 4194304。Windows 好像并没有官方文档说明最大进程数,但是可以在 Pushing the Limits of Windows: Processes and Threads 一文中了解到相关的信息。

内存

Xv6 对内存的管理看起来比较简单粗暴,直接使用一个链表将所有的可用内存串在一起。从代码中可以看到,Xv6 每页的大小为 4096 个字节,其能接受的最大内存大小为 128M。并且 Xv6 只使用 0x80000000L 之后的内存,在内核链接脚本解析中有提到过,之前的地址空间将会用于放置 IO 设备。

总结

总体难度不大,但是从这个实验却可以了解到系统内部的很多细节知识,不得不说这实验设计的真不错。

  • 本文标题:实验2:系统调用
  • 本文作者:Jacksing
  • 创建时间:2022-02-13 01:45:59
  • 本文链接:https://wzzzx.github.io/6-S081/lab2-system-call/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论