主要对内核做了这些更改:
-
trace系统调用
-
选择把一个新的变量watch_int添加到proc的结构体中(proc.h)
-
在allocproc增加一行:初始化proc的watch_int 为0 (proc.c)
-
在freeproc中增加一行:将proc的watch_int 重新设置为0(proc.c)
-
在fork中增加一行,让子进程继承父进程的watch_int(proc.c)
-
增加函数sys_trace,只需要将watch_int修改为传入参数即可(syscall.c)
trace实现中对内核做的修改主要内容就这些 -
sysinfo系统调用
-
主要是增加了两个函数calnumproc(proc.c),用于统计目前总共的进程数,通过遍历全局变量proc(一个保存所有进程信息的数组),另外是cal_free(kalloc.c),根据kalloc函数可以看出xv6的物理内存由数据结构kmem串成的空闲链表管理,遍历这个链表就可以知道剩余的物理内存。
-
总结:做完感觉没啥收获。可能主要原因这些系统调用的实现都是照本宣科,就模仿写好的系统调用来类似地写,但其实对这些系统调用更加基本的实现方法并不太清楚。等学习了后面的课再回来想想可能会有些收获吧
-
先记录一下做这个lab的疑问,后面再回来思考:
-
从内核到用户空间的数据转移为什么要用copyout,直接的赋值语句会发生什么?
-
一个系统调用的大概流程是:ecall指令->cpu跳转到指定的处理地址->uservec, usertrap函数调用->syscall系统调用入口->跳转到指定的处理函数…这其中的细节目前完全不清楚
-
内核栈的管理,与物理内存的映射关系,从用户空间到内核栈的参数传递,为什么要采用如此费力的实现方式?(比如用argint, argaddr来从进程的tramframe指针取参数),具体参数传送的细节也还没搞明白