Day5
xv6 os에서 system call 이 어떻게 작동하는지 살펴보았다. 그 중에서도 process와 관련된 wait, exit 등의 system call을 직접 수정하고 또 waitpid 를 추가해 보았다.
-
먼저 xv6 에서 프로세스가 관리되는 구조를 파악했다. 사용되는 함수들은 fork, exit 등등 평소에 알고있던 것들과 같아서 어떤 식으로 작동하겠다 하는 생각을 가지고 실제로 구현된 논리들을 따라 가 보았다. 프로세스가 wait, sleep 을 통해서 block 될 때, 스케쥴러에서 어떤식으로 그것들을 관리하는지 얕게나마 볼 수 있었고, 프로세스들간의 유저 그룹 같은 개념에 대해서도 생각 해 보았다. xv6 에서는 하나의 프로세스 스트럭쳐만 가지고 관리되고 있는 듯 했다.
-
첫번째 문제에서 exit() system call을 수정하여, 종료코드를 받을 수 있게 수정하려면, user level program 에서 system call을 통해서 어떻게 argument를 전달하는지를 파악해야 했다. system call 이 호출되고 trap 이 일어나면, trapframe 이라는 구조에 여러가지 정보를 저장해서 커널에 넘겨 주게 된다. 여기에는 user stack의 주소도 있어서, 이것을 통해서 argument에 접근할 수 있게 된다.
-
system call 을 수정하려면 많은 부분이 바뀌어야 했다. system call 이 선언되고 정의된 부분들을 찾아서 수정하면서 구조들을 다시한번 볼 수있었고, 나의 테스트 프로그램을 xv6에 올려서 테스트도 진행 해보았다. 또 waitpid 라는 system call을 추가해 보았는데, 구조를 파악이 되니 어떤식으로 해야 할지 쉽게 알 수 있었다.