組長: B10415002 余福浩
組員: B10415018 沈政一
組員: B10415037 陳品劭
github: https://github.com/bamdart/xv6-public
進入xv6後,可以輸入foo新增多個proccess
輸入suspend,可令所有proccess進入休眠狀態,並印出所有proccess的狀態資訊,此後系統維持suspend狀態。
在suspend狀態下,輸入ctrl + w 可喚醒所有proccess,並印出所有proccess的狀態資訊,令系統回復正常運作狀態。

function call的流程 - 以lsproc為例

使用foo 新增proccess

輸入suspend,進入suspend狀態,所有proccess進入sleep。


在suspend狀態,按下ctrl + w 即可喚醒系統,所有proccess回復到sleep前的狀態(pmwakeup())。

總共增加了以下 system call:
修改排程方法:
在 sysproc.c 新增以下function
sys_lsproc

sys_suspend

sys_pmwakeup

sys_halt

在 syscall.h 中定義system call的number

在 user.h 定義相關function

在 syscall.c 的syscalls[]增加相關system call


在 usys.S 增加 macro connect system call function

在 defs.h 新增 system call

在 sysproc.c新增system call對應得fuction


新增 lsproc.c

新增 suspend.c

新增 pmwakeup.c

新增 foo.c

在Makefile裡面增加指令

proc.c
修改scheduler


新增int lsproc(void)

新增int suspend(void)

新增int pmwakeup(void)

新增void printfstate(struct proc *p)

console.c

本來嘗試使用priority解決wakeup後排程出現的問題,因此加入了優先權排程,將proccess狀態改成Runnable,藉由排程讓proccess自動回到run,但發現無效。後來用記住睡眠前狀態來蘇醒的方式來解決了此問題。


在這次的project中,我們花了不少的時間研究、trace xv6這個小型的作業系統,發現其中不只有C語言更有用到不少組合語言,也因此讓短短的程式碼變得更難以理解,若想清楚的了解其中如何運作,必須有相當好的C語言與組合語言基礎,不然則需要花非常多的時間去理解。
這次我們實作功能的途中,也遭遇到了許多困難,常常修改一、兩行程式碼,就會使xv6的運作出現error,我們也因此了解到,在實作作業系統的過程中,需要考慮的環節非常多,code之間常常牽一髮而動全身,稍有不慎就會不小心使OS在某些部分出錯,所以在做各種更動之前,都需要謹慎思量各種可能的影響,才有辦法順利的進行修改。