핀토스 프로젝트 2가 끝났다. 결코 쉽지 않았지만 문제를 해결해나가면서 많이 행복했다.
What I did?
1. Argument Passing
- 프로그램을 진행할 때, command 창으로 입력되는 인자들을 parsing해서 레지스터 스택에 적재한다. 이때, 각 word를 적재한 후에, %rsp를 8bytes 씩 내리면서(movq) 적재한다. 또한 %rsi에는 argv를, %rdi에는 argc를 세팅하여 load하고 interrupt return을 진행하도록 한다.
2. System Calls
- 정말 다양한 system calls을 구현한다. 주목해야할 것은 fork와 wait라고 생각한다. fork는 새로운 process를 생성하고, resource를 복사한다. 이 때, 어떤 주체가 각 함수를 진행하는지 확인하는 것이 정말 재밌다. wait는 실행 중인 녀석을 기다리는지, 이미 끝난 녀석을 기다리는지 확인하고 return하는 과정이 정말 재밌다.
3. Denying Writes to Executables
- command 창에 run을 진행하면 해당 프로그램이 가장 먼저 load된다. 이 load된 executable 파일에 write를 할 수 없게해야한다. 어느 타이밍에 이 장치를 걸어주고, 어떤 프로세스가 순서대로 진행되는지 확인하는 것이 재밌다.
What I feel?
-
cmd창에 명령어를 입력해서 순식간에 처리되던 프로그램들이 어떻게 처리됐는지 확인했다.
-
레지스터 변수와 한층 더 친해졌다. 어떤 과정을 통해서 스택에 쌓였고, 또 어떤 어셈블리어를 통해서 레지스터 변수에 접근하고 변경하는지 확인할 수 있었다.
-
page allocation을 진행했다. 더 깊게 파야한다.
-
나는 더이상 유저가 아니다. 나는 운영체제다.