지난 한 주차 간 Argument Passing, User Memory, System Calls, Process Termination Messages 등의 과제를 수행하는 PintOS 프로젝트 2를 진행하였다.
이전 주차와 마찬가지로 기존의 PintOS 운영체제에 갖춰져 있지 않은 다양한 기능을 구현하는 시간이었다.
먼저 Argument Passing 과제의 목표는 커맨드 라인에 입력된 명령어를 실행하는 것이었다.
프로그램 이름을 파싱한 후 커맨드 라인에서 프로세스 이름을 확인하고 start_process() 인터럽트 프레임을 초기화하고 load() 사용자 프로그램을 메모리에 적재한 후 argument_stack() 인자들을 스택에 삽입해야 한다.
load() 메모리를 할당 받아 사용자 프로그램을 적재하기 전에 Argument Passing 기능을 추가하여 커맨드 라인을 Parsing하여 인자를 확인할 수 있도록 하는 것이 과제의 핵심적인 부분이었다.
응용 프로그램의 실행에 핵심적인 흐름을 파악할 수 있었다.
System Calls 과제의 목표는 시스템 콜 핸들러 및 시스템 콜을 구현하는 것이다.
기존의 PintOS 운영체제는 시스템 콜 핸들러가 구현되어 있지 않아 시스템 콜이 호출될 수 없으므로 응용 프로그램이 정상적으로 동작하지 않는다.
시스템 콜은 운영 체제가 제공하는 사용자 모드 프로그램이 커널 기능을 사용할 수 있도록 하는 프로그래밍 인터페이스이다.
시스템 콜은 커널 모드에서 실행되고, 처리 후 사용자 모드로 복귀한다는 특성을 가진다.
해당 과제를 수행하는 과정에서 read()와 write() 시스템 콜의 코드를 추가하면서 이전에 완성하였던 기능이 이전처럼 제대로 작동하지 않게 되는 발생하는 문제를 경험하였다.
시스템 콜이라는 강력한 프로그래밍 인터페이스에 대해 이해할 수 있게 되었다.
프로세스 계층구조의 과제의 목표는 프로세스 간의 부모와 자식 관계를 구현하고, 부모가 자식 프로세스의 종료를 대기하는 기능을 구현하는 것이다.
기존의 PintOS 운영체제는 프로세스 구조체에 부모와 자식 관계를 명시하는 정보가 없기 때문에 부모와 자식의 구분이 없고, 자식 프로세스의 정보를 알지 못하기 때문에 자식의 시작/종료 전에 부모 프로세스가 종료되는 현상이 발생하고 프로그램이 실행되지 않는다.
단계별로 필요한 기능들을 추가하여 fork()와 exec() 시스템 콜을 완성하는 것이 과제의 핵심이었다.
운영체제 강의를 해주셨던 권영진 교수님께서 말씀하셨던 것과 같이 PintOS 프로젝트는 이전에 해왔던 과제들과 비교해 다양한 파일의 규모가 비교적 큰 코드를 다루는 경험이었다.
그래서인지 예상치 못한 문제가 끊임없이 발생하였으며 그러한 문제들을 해결하기 위해 노력하는 고된 시간이었다.
'Page fault at 0x8: not present error reading page in kernel context.'와 같이 끝내 해결하지 못한 문제들도 있었다.
여러 에러 문제들을 해결하기 위해 시간을 생각보다 많이 쓰게되어 주어진 모든 과제들을 마무리하는 데에 실패하였다.
설명을 읽고 함수에 대한 전반적인 구조를 이해하더라도 그것을 코드로 구현하는 것은 여전히 어려움이 많다고 느꼈다.
이러한 점이 상당히 아쉬웠고 운영체제에 대한 이해가 부족하기 때문에 부족한 부분들을 부지런히 채워나가야겠다는 생각이 들었다.
많이 부족하다는 사실을 다시 한번 깨닫고 운영체제에 대한 공부를 더욱 열심히 해야되겠다는 생각을 가지게 되는 시간이었다.